/** * Copyright (c) 2013-2016, The SeedStack authors <http://seedstack.org> * * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ package org.seedstack.seed.security.internal.authorization; import org.apache.shiro.authz.Permission; import org.apache.shiro.authz.permission.WildcardPermission; import org.seedstack.seed.security.Scope; /** * Represents a permission given on a limited scope */ public class ScopePermission implements Permission { private String permission; private Scope scope; /** * Constructor with a permission * * @param permission * the permission */ public ScopePermission(String permission) { this.permission = permission; } /** * Constructor with permissions and scope. * * @param permission * the permission * @param scope * the scope */ public ScopePermission(String permission, Scope scope) { this.permission = permission; this.scope = scope; } @Override public boolean implies(Permission p) { if (scope != null && p instanceof ScopePermission) { ScopePermission sp = (ScopePermission) p; return scope.includes(sp.getScope()) && buildWildcardPermission().implies(sp.buildWildcardPermission()); } else { return buildWildcardPermission().implies(p); } } private WildcardPermission buildWildcardPermission() { return new WildcardPermission(permission); } /** * Getter permission * * @return the permission */ public String getPermission() { return permission; } /** * Getter scopes * * @return the scopes */ public Scope getScope() { return scope; } @Override public boolean equals(Object o) { if (this == o) { return true; } if (o == null || getClass() != o.getClass()) { return false; } ScopePermission that = (ScopePermission) o; return permission.equals(that.permission) && scope.equals(that.scope); } @Override public int hashCode() { int result = permission.hashCode(); result = 31 * result + scope.hashCode(); return result; } }