shiro讲解之 多Realm 之 Authorization

来源:互联网 发布:linux 打开vim编辑器 编辑:程序博客网 时间:2024/05/17 15:19

shiro讲解之 多Realm 之 Authorization

在本节之前我们学习了Shiro 的 多Realm 和 Authorization,现在我们将学习一下Shiro 的多 Realm Authorization。


实例

  • 多 Realm 的配置(参考 shiro讲解之 多Realm 之 Authentication)

  • Realms
    这里我们定义两个 Realm 分别为 shiroRealm 和 myRealm, 此处我们将不在贴出多 Realm 认证部分的代码了,我们至贴出 授权部分的代码。

    • shiroRealm

      @Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {    Object principal = principals.getPrimaryPrincipal();    Set<String> roles = new HashSet<>();    roles.add("admin");    SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);    return info;}
    • myRealm

      @Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {    Object principal = principals.getPrimaryPrincipal();    Set<String> roles = new HashSet<>();    roles.add("user");    SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);    return info;}

      在角色的设定上我们将登录的 Subject 同时赋予了 admin 和 user 角色。

  • 资源设置(Shiro Filter)

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">    <property name="securityManager" ref="securityManager" />    <property name="loginUrl" value="/login/toLogin" />    <property name="successUrl" value="/example/index" />    <property name="unauthorizedUrl" value="/example/unauthorized" />    <property name="filterChainDefinitions">        <value>            /login/toLogin = anon            /login/loginVal = anon            /login/logout = logout            /example/admin =roles[admin]            /example/user = roles[user]            /** = authc        </value>    </property></bean>

    在资源的设定上,我们将 /example/admin 和 /example/user 两个资源分别交由 admin和 user 权限,即只有同时拥有 admin 和 user 角色时以上两个资源都能被访问。


结果

这里写图片描述

这里写图片描述.


小结

  • 多 Realm 的 Authorization 与多 Realm 的 Authentication 不同,Authorization 没有认证策略的选择。

  • 使用多 Realm Authorization 时Subject 被赋予的角色属性是可以叠加的即一个Realm 将 Subjct 角色赋为 admin 另一个赋为 user ,那么该 Subject 最终两拥有两个角色:admin 和 user。进而以上两个的资源 Subject 也将同时享有。

    所以在做多Realm 的 Authorization 尤其注意角色的赋予和权限边界的限定。

  • Authorization 方法的触发在 Subject 访问某资源时发生,同时若使用了Shiro 的缓存功能的话 Subject的角色属性将会被写入缓存。当再次访问资源时,Shiro 将优先从缓存中获取当前 Subject 的角色属性。(Shiro 的缓存我们将在后面的章节中学)