Shiro8-自定义 Realm 进行授权

2017-05-19  本文已影响51人  我相信你爱过gg

在实际开发中我们的权限数据都是从数据库中获取的, 所以就需要我们自定一个 Realm 从数据库进行查询权限数据,将权限数据返回给 authorizer(授权器).

自定义 Realm

我们在原来的那个自定义 Realm 中修改 doGetAuthorizationInfo 方法,就可以.

具体实现

    // 用于授权
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(
            PrincipalCollection principals) {
        
        //从 principals获取主身份信息
        //将getPrimaryPrincipal方法返回值转为真实身份类型(在上边的doGetAuthenticationInfo认证通过填充到SimpleAuthenticationInfo中身份类型),
        String userCode =  (String) principals.getPrimaryPrincipal();
        
        //根据身份信息获取权限信息
        //连接数据库...
        //模拟从数据库获取到数据
        List<String> permissions = new ArrayList<String>();
        permissions.add("user:create");//用户的创建
        permissions.add("items:add");//商品添加权限
        //....
        
        //查到权限数据,返回授权信息(要包括 上边的permissions)
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        //将上边查询到授权信息填充到simpleAuthorizationInfo对象中
        simpleAuthorizationInfo.addStringPermissions(permissions);

        return simpleAuthorizationInfo;
    }

授权流程

1.对 subject 进行授权, 调用方法 isPermitted("")
2.SecurityManager 执行授权, 通过 ModularRealmAuthorizer 执行授权.
3.ModularRealmAuthorizer 调用 Realm(我们自定义的)的 doGetAuthorizationInfo 方法 从数据库查询权限数据, 并返回给ModularRealmAuthorizer.
4.ModularRealmAuthorizer 调用 PermissionResolver 进行权限对比.
5.对比后,如果 isPermitted 方法中的参数在 realm 查询到的权限数据中,说明用户有权限,否则没有权限.

上一篇 下一篇

猜你喜欢

热点阅读