shiro 权限认证

1.对有没有访问权限的理解。  我们这里要对系统中的 角色组、角色、用户、功能 之间的关系要理清楚,http://blog.csdn.net/baicp3/article/details/45028013方便下面用户是否具有某一url的访问。

我们看shiro的配置文件,所以的请求都是需要用户登录的

因而用户 在登录成功时候,shiro已经把该用户是否有访问某一url的权限已经判断好了。

看下面简单的代码

   @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //获取当前登陆的用户名
        String loginName = 
              (String) principalCollection.fromRealm(getName()).iterator().next();
        //根据用户名查找对象
        User user = userService.findByLoginName(loginName);
        if(user != null) {
            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            //添加角色(Set集合<字符串>)
            info.setRoles(user.getGroupNameSet());
            //迭代用户对应的角色集合,为了获取角色对应的权限
            for(UserGroup g : user.getUserGroupList()) {
                //添加permission
                info.addStringPermissions(g.getPermissionStringList());
            }
            return info;
        }
        return null;
    }

   
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(
            AuthenticationToken authenticationToken) throws AuthenticationException {
        UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
        //根据用户名去查找对象
        User user = userService.findByLoginName(token.getUsername());
       
        if(user != null) {
          return new SimpleAuthenticationInfo(user.getName(),
              user.getPassword(),getName());
        }
        return null;
    }

    public void setUserService(UserService userService) {
        this.userService = userService;
    }

}

shiro其实已经帮我们写好了方法,我们只要去重写 首先看源码

本人系统这个类RapShiroRealm 去实现(抽象类AuthorizingRealm 重写doGetAuthorizationInfo方法 权限认证) 

(AuthorizingRealm类又继承AuthenticatingRealm抽象类  shiro开发者帮我们写好了。重写doGetAuthenticationInfo方法 认证回调函数 登录时调用)看上面的两个方法帮助我们更好的去理解。

详细一点的步骤:

 首先在访问我们controller的方法上定义好

访问该controller 需要用户携带 demo:simple. 通过重写类AuthorizingRealm的方法doGetAuthorizationInfo 在该方法中,用户在登录的时候执行,  SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
            //添加角色(Set集合<字符串>)
            info.setRoles(user.getGroupNameSet());
            //迭代用户对应的角色集合,为了获取角色对应的权限
            for(UserGroup g : user.getUserGroupList()) {
                //添加permission
                info.addStringPermissions(g.getPermissionStringList());
            }  这段代码 可以把该用户到底拥有哪些permission都存储起来了。

2.由于我们重写了shiro的抽象类AuthorizingRealm 的方法doGetAuthorizationInfo  他在登录的时候就会将登录成功之后改用户是否有哪些地方的url访问权限都存放起来了。要用的时候直接如下图判断:

PS:个人理解:应该是用户登录的时候,shiro会把用户所有的权限保存起来,当用户请求跳转url的时候,会先取出权限,判断用户是否有权限,如果有,跳转url,执行请求,如果没有,则拒绝。
--------------------- 
作者:baicp3 
来源:CSDN 
原文:https://blog.csdn.net/baicp3/article/details/45913387 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/qq_41397689/article/details/86570213