shiro的授权过程

1:通过继承shiro的AuthorizingRealm类,并实现它的doGetAuthorizationInfo方法来进行授权。

2:doGetAuthorizationInfo方法的参数是认证通过的principal的集合(因为可多个realm,且有不同的认证策略)

3:doGetAuthorizationInfo方法的作用就是:登录认证成功之后,根据认证通过的principal,获取它的角色集合和权限集合,并封装成SimpleAuthorizationInfo对象,最终供shiro的授权器来调用,判断是否具有某个角色或某个权限。

4:shiro有四种方式会调用doGetAuthorizationInfo方法

(1):xml配置方式:当登陆成功之后,访问/pages/user.jsp时,会调用doGetAuthorizationInfo方法,判断当前用户是否具有user角色。该种方式拦截到没有权限的url时,会跳转到配置的unauthorizedUrl指向的页面。

(2):硬编码方式:通过以下代码进行角色活权限的判断时, 实际上最终也会调用doGetAuthorizationInfo方法,判断当前用户是否具有某角色或某权限。如果前端使用beetl标签,可以配合该方式,当做页面元素的判断(因为现在很少用jsp页面了,所以第4种的jsp标签也不咋用了)

getSubject().isPermitted(permission);

getSubject().hasRole(roleName);

(3):注解式:通过在执行的Java方法上放置相应的注解, 实际上最终也会调用doGetAuthorizationInfo方法,判断当前用户是否具有某角色或某权限。该种方式拦截到没有权限的url时,会抛出异常,所以为了界面友好,我们需要捕获异常,跳转到一个友好的页面。可以参考这篇文章:https://blog.csdn.net/ITWANGBOIT/article/details/97640614

@RequiresRoles("admin")  

public void hello() {  

        //有权限  

}   

@RequiresPermissions("{url}")

public void hello() {  

     //有权限  

}   

(4):JSP/GSP标签:在JSP/GSP页面通过相应的标签来决定是否显示某些页面元素。实际上最终也会调用doGetAuthorizationInfo方法,判断当前用户是否具有某角色或某权限。因为现在很少用jsp页面了,所以该种jsp标签也不咋用了

<shiro:hasRole name="admin">  

   <input   type="text"    name="userName">

</shiro:hasRole>  

5:由于可以给shiro设置多个realm,每个realm都可以仅仅进行认证或授权,或者既认证又授权;而多个realm都认证的话,是根据认证策略将多个realm的认证结果组合成最终的认证结果;但是如果多个realm都授权的话,那么多个realm中只要有一个realm授权过,得到的结果就是true。代码如下:

原文地址:https://www.cnblogs.com/hzcya1995/p/13302478.html