shiro的RequiresPermissions注解⽤法
RequiresPermissions的作⽤
RequiresPermissions是shiro提供的⼀个注解类。主要是⽤作权限校验的⼀种⽅式。
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface RequiresPermissions {
/**
* The permission string which will be passed to {@link org.apache.shiro.subject.Subject#isPermitted(String)}
* to determine if the user is allowed to invoke the code protected by this annotation.
*/
String[] value();
/**
* The logical operation for the permission checks in case multiple roles are specified. AND is the default
* @since 1.1.0
*/
Logical logical() default Logical.AND;
}
⼀般情况下,注解类作⽤在需要拦截的⽅法上。
从value的注释上可以看到,注解上的第⼀个参数的值会传到Subject的isPermitted⽅法去。所以原理都是通过Subject的isPermitted去校验权限。
RequiresPermissions的value格式
简单形式
value只是⼀个普通的字符串⽐如:@RequiresPermissions(“dosomething”)
多层级形式
⽤冒号隔开两个字符串,⽐如:@RequiresPermissions(“dosomething:view,edit”)
冒号隔开的第⼀个字符串⼀般是操作的领域对象,⽽第⼆个字符串⼀般是操作的类型。
实例级访问控制
⽤冒号隔开多个字符串,⽐如:@RequiresPermissions(“dosomething:view,edit:213”)冒号隔开的第三个字符串内容⼀般是⼀个操作对象的id,来控制具体的对象实例是否有权限来调⽤⽅法。
这个格式应该只是⼀种规范标准,不⼀定⾮要严格执⾏才能达到效果。
# WildcardPermissionResolver类中
public Permission resolvePermission(String permissionString) {
return new WildcardPermission(permissionString);
}
#AuthorizingRealm类中的两个⽅法:
根据字符串resolve成的⼀个Permission
public boolean isPermitted(PrincipalCollection principals, String permission) {
Permission p = getPermissionResolver().resolvePermission(permission);//实现在WildcardPermissionResolver类中
return isPermitted(principals, p);
}
在AuthorizingRealm类中的权限⽐较实现。⽽其中的permission就是上⾯⽣成的,⽽AuthorizationInfo的内容⼀般都是从数据库等等地⽅查询出权限列表寄放到i nfo⾥。
//visibility changed from private to protected per SHIRO-332
protected boolean isPermitted(Permission permission, AuthorizationInfo info) {
Collection<Permission> perms = getPermissions(info);
if (perms != null && !perms.isEmpty()) {
for (Permission perm : perms) {
if (perm.implies(permission)) {
return true;
}
}
}
return false;
}
public boolean implies(Permission p) {
// By default only supports comparisons with other WildcardPermissions
if (!(p instanceof WildcardPermission)) {
return false;
}
WildcardPermission wp = (WildcardPermission) p;
List<Set<String>> otherParts = wp.getParts();
int i = 0;
for (Set<String> otherPart : otherParts) {
// If this permission has less parts than the other permission, everything after the number of parts contained
// in this permission is automatically implied, so return true
if (getParts().size() - 1 < i) {
return true;
} else {
shiro权限控制Set<String> part = getParts().get(i);
if (!ains(WILDCARD_TOKEN) && !ainsAll(otherPart)) {
return false;
}
i++;
}
}
// If this permission has more parts than the other parts, only imply it if all of the other parts are wildcards
for (; i < getParts().size(); i++) {
Set<String> part = getParts().get(i);
if (!ains(WILDCARD_TOKEN)) {
return false;
}
}
return true;
}
所以value只要和存储在数据库⾥⾯的权限信息段⼀致应该就可以。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论