shiro 授權和註解開發(三)

說明:本篇博客基於前兩篇博客構建:
shiro入門(一)
Shiro身份認證及鹽加密(二)

這是數據庫的表設計:
在這裏插入圖片描述

授權

在ShiroUserMapper.xml中新增內容

<!--  這是根據用戶id獲取到所擁有的角色集合-->
  <select id="getRolesByUserId" resultType="java.lang.String" parameterType="java.lang.Integer">
    select r.roleid from t_shiro_user u,t_shiro_user_role ur,t_shiro_role r
      where u.userid = ur.userid and ur.roleid = r.roleid
      and u.userid = #{userid}
  </select>
  
  <!--  這是根據用戶id獲取到所擁有的權限集合-->
  <select id="getPersByUserId" resultType="java.lang.String" parameterType="java.lang.Integer">
    select p.permission from t_shiro_user u,t_shiro_user_role ur,t_shiro_role_permission rp,t_shiro_permission p
    where u.userid = ur.userid and ur.roleid = rp.roleid and rp.perid = p.perid
    and u.userid = #{userid}
  </select>

mapper接口和server層這對應的方法就不貼了

重寫自定義realm中的授權方法

    /**
     *用戶授權(獲取權限)
     * @param principalCollection
     * @return
     */
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        System.out.println("用戶授權。。。。");
        //獲取到用戶名
        String username = principalCollection.getPrimaryPrincipal().toString();
        //更具用戶名獲取當前用戶
        ShiroUser user = shiroUserService.queryByName(username);
        //獲取用戶的角色列表
        Set<String> roles = shiroUserService.getRolesByUserId(user.getUserid());
        //獲取當前用戶的權限列表
        Set<String> pers = shiroUserService.getPersByUserId(user.getUserid());
    
        
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        //將用戶的授權信息保持到 info 對象中(授權信息包括 角色和權限)
        info.setRoles(roles);
        info.setStringPermissions(pers);

        return info;
    }

這樣當用戶一登錄就會調用 doGetAuthorizationInfo 來獲取權限。我們就能夠通過數據庫靈魂配置權限了

註解式開發

常用註解介紹
@RequiresAuthenthentication:表示當前Subject已經通過login進行身份驗證;即 Subject.isAuthenticated()返回 true

@RequiresUser:表示當前Subject已經身份驗證或者通過記住我登錄的

@RequiresGuest:表示當前Subject沒有身份驗證或者通過記住我登錄過,即是遊客身份

@RequiresRoles(value = {"admin","user"},logical = Logical.AND):表示當前Subject需要角色admin和user

@RequiresPermissions(value = {"user:delete","user:b"},logical = Logical.OR):表示當前Subject需要權限user:delete或者user:b

備註:Logical是決定多條件下的關係,支持 AND和 OR (並且和或者)

Controller層


    /**
     * 用戶必須登錄後才能請求
     * @param request
     * @return
     */
    @RequiresUser
    @RequestMapping("/passUser")
    public String passUser(HttpServletRequest request){
        return "admin/addUser";
    }


    /**
     * 用戶必須擁有角色id爲 1 和 4 的這兩個角色
     *
     * Logical.RO 就是或的意思,也就是說用戶 必須擁有角色id爲 1 或 4 的這兩個角色
     * @param request
     * @return
     */
    @RequiresRoles(value = {"1","4"},logical = Logical.AND)
    @RequestMapping("/passRole")
    public String passRole(HttpServletRequest request){
        return "admin/listUser";
    }


    /**
     * 用戶必須擁有 user:update 或 user:view 權限才能訪問
     *
     * 當然:Logical.OR 能改成 Logical.AND
     * @param request
     * @return
     */
    @RequiresPermissions(value = {"user:update","user:view"},logical = Logical.OR)
    @RequestMapping("/passPer")
    public String passPer(HttpServletRequest request){
        return "admin/resetPwd";
    }

Springmvc.xml(springmvc的配置文件中)

    <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
          depends-on="lifecycleBeanPostProcessor">
        <property name="proxyTargetClass" value="true"></property>
    </bean>
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager"/>
    </bean>

    <!--    springmvc整合 shiro 實現註解式權限-->
    <bean id="exceptionResolver" class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <!--                當用戶沒有權限會調轉到 unauthorized.jsp頁面-->
                <prop key="org.apache.shiro.authz.UnauthorizedException">
                    unauthorized
                </prop>
            </props>
        </property>
        <property name="defaultErrorView" value="unauthorized"/>
    </bean>

Jsp測試代碼

<ul>
    shiro註解
    <li>
        <a href="${pageContext.request.contextPath}/passUser">用戶認證</a>
    </li>
    <li>
        <a href="${pageContext.request.contextPath}/passRole">角色</a>
    </li>
    <li>
        <a href="${pageContext.request.contextPath}/passPer">權限認證</a>
    </li>
</ul>

測結果
zs只能查看身份認證的按鈕內容
ls、ww可以看權限認證按鈕內容
zdm可以看所有按鈕的內容

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章