Authorizer、PermissionResolver及RolePermissionResolver

本人语文不咋地 理解慢
理解:
Authorizer 的职责是进行授权(访问控制)  这个东西就是用来授权的;
PermissionResolver 用于 解析权限字符串   得到 Permission 实例;
Role PermissionResolver 用于根据角色解析相应的权限集合


BitPermission 用于实现位移方式的权限,如规则是:
权限字符串格式:+ 资源字符串 + 权限位 + 实例 ID;以 + 开头中间通过 + 分割;权限:0 表示所有权限;1 新 增(二进制:0001)、2 修改(二进制:0010)、4 删除(二进制:0100)、8 查看(二进制:1000);如 +u ser+10 表示对资源 user 拥有修改 / 查看权限。

实例:
    public BitPermission(String permission){
        String[] array = permission.split("\\+");
        if(array.length > 1) {
            resourceIdentify = array[1];
        }
        if(resourceIdentify==null || resourceIdentify.equals("")){
            resourceIdentify = "*";
        }
        if(array.length > 2) {
            permissionBit = Integer.valueOf(array[2]);
        }
        if(array.length > 3) {
            instanceId = array[3];
        } if(instanceId==null || instanceId.equals("")) {
            instanceId = "*";
        }

    }
    public boolean implies(Permission permission) {
        if (!(permission instanceof BitPermission)) {
            return false;
        }
        BitPermission other = (BitPermission) permission;
        if (!("*".equals(this.resourceIdentify) || this.resourceIdentify.equals(other.resourceIdentify))) {
            return false;
        }
        return true;
    }

声明BitPremission
public class BitAndWildPermissionResolver implements PermissionResolver {
    public Permission resolvePermission(String permissionString) {
        if(permissionString.startsWith("+")) {
            return new BitPermission(permissionString);
        }
        return new WildcardPermission(permissionString);

    }
}
权限解析类通过这个类得到权限实例
public class MyRolePermissionResolver implements RolePermissionResolver {
    public Collection<Permission> resolvePermissionsInRole(String roleString) {
        if("role1".equals(roleString)) {
            return Arrays.asList((Permission)new WildcardPermission("menu:*"));
        } return null;
    }
}
角色权限解析类,通过角色获取权限集合
public class MyRealmTest  extends AuthorizingRealm {
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        authorizationInfo.addRole("role1");
        authorizationInfo.addRole("role2");
        authorizationInfo.addObjectPermission(new BitPermission("+user1+10"));
        authorizationInfo.addObjectPermission(new WildcardPermission("user1:*"));
        authorizationInfo.addStringPermission("+user2+10");
        authorizationInfo.addStringPermission("user2:*");
        return authorizationInfo;

    }

    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        String username=(String)authenticationToken.getPrincipal();
        String password=new String((char[])authenticationToken.getCredentials());
        if(!"zhang".equals(username)){
            throw new UnknownAccountException();
        }
        if(!"123".equals(password)){
            new IncorrectCredentialsException();
        }
        return new SimpleAuthenticationInfo(username,password,getName());
    }
}
通过这个Realm添加权限和角色
@Test
public void testIsPermitted(){
    login("classpath:shiro-authorizer.ini");
    Assert.assertTrue(SecurityUtils.getSubject().isPermitted("user1:update"));
    Assert.assertTrue(SecurityUtils.getSubject().isPermitted("user2:update"));
    Assert.assertTrue(SecurityUtils.getSubject().isPermitted("+user1+2"));//新增权限
    Assert.assertTrue(SecurityUtils.getSubject().isPermitted("+user1+8"));//查看权限
    Assert.assertTrue(SecurityUtils.getSubject().isPermitted("+user2+10"));//新增及查看
    //Assert.assertFalse(SecurityUtils.getSubject().isPermitted("+user1+4"));//没有删除权限
    Assert.assertTrue(SecurityUtils.getSubject().isPermitted("menu:view"));//通过MyRolePermissionResolver解析得到的权限
}
进行测试类测试角色信息

Realm-->MyRolePermissionResolver(获取权限集合)-->BitAndWildPermissionResolver(获取权限实例解析)
以上流程是目前理解 具体流程还给在核对一下。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值