天天看點

好好程式設計-物流項目14【授權管理-shiro實作】

 上篇文章實作類基于Shiro的認證操作,本文來實作下授權操作。

授權

Shiro授權原理及細節内容歡迎參考如下連結

https://dpb-bobokaoya-sm.blog.csdn.net/article/details/86652418

1.擷取使用者對應的權限

 本項目中我們的權限就隻涉及到角色,沒有再細粒度到菜單,感興趣的可以自己可擴充實作下。

IUserService方法

/**
 * 根據使用者編号擷取對應的權限資訊
 * @param userId
 * @return
 */
public List<Role> queryRoleByUserId(int userId);      

UserServiceImpl實作

@Override
public List<Role> queryRoleByUserId(int userId) {
    
    return roleMapper.queryRoleByUserId(userId);
}      

RoleMapper接口中定義方法

List<Role> queryRoleByUserId(int userId);      

RoleMapper映射檔案中添加sql

<select id="queryRoleByUserId" resultMap="BaseResultMap">
    select * 
    from t_role t1 
    where t1.role_id in (
        select role_id from t_user_role where user_id = #{id}
    )
</select>      

2.授權方法

 修改MyRealm中授權的方法

/**
 * 授權的方法
 */
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    // 擷取認證的資訊
    User user = (User) principals.getPrimaryPrincipal();
    // 擷取登入使用者對應的權限
    List<Role> roles = userService.queryRoleByUserId(user.getUserId());
    SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
    for (Role role : roles) {
        // 将使用者具有的角色儲存到SimpleAuthorizationInfo對象中
        info.addRole(role.getRoleName());
    }
    return info;
}      

3.SpringMVC添加配置

<!-- 開啟Shiro注解 -->
<aop:config proxy-target-class="true"></aop:config>
<bean
    class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
    <property name="securityManager" ref="securityManager" />
</bean>      

4.資料準備

 建立一個賬号配置設定對應的角色用來測試。

好好程式設計-物流項目14【授權管理-shiro實作】
好好程式設計-物流項目14【授權管理-shiro實作】

5.限制權限

// 目前登入使用者需要"管理者角色才能通路"
@RequiresRoles("管理者")
@RequestMapping("/queryPage")
public String queryPage(UserDto dto,Model model){
    PageInfo<User> pageModel = userService.queryPage(dto);
    model.addAttribute("pageModel", pageModel);
    return "user/user";
}      

用沒有"管理者"角色的通路測試

好好程式設計-物流項目14【授權管理-shiro實作】

用具有通路權限的賬号登入

好好程式設計-物流項目14【授權管理-shiro實作】

有權的通路成功。

解決沒有通路權限的跳轉問題。

建立一個沒有權限的跳轉頁面

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>無标題文檔</title>
<link href="css/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/jquery.js"></script>

<script language="javascript">
    $(function() {
        $('.error').css({
            'position' : 'absolute',
            'left' : ($(window).width() - 490) / 2
        });
        $(window).resize(function() {
            $('.error').css({
                'position' : 'absolute',
                'left' : ($(window).width() - 490) / 2
            });
        })
    });
</script>
</head>
<body style="background: #edf6fa;">
    <div class="place">
        <span>位置:</span>
        <ul class="placeul">
            <li><a href="#">首頁</a></li>
            <li><a href="#">沒有通路權限提示</a></li>
        </ul>
    </div>
    <div class="error">
        <h2>非常遺憾,您沒有權限通路該頁面!</h2>
        <p>看到這個提示,就自認倒黴吧!</p>
        <div class="reindex">
            <a href="/main" target="_parent">傳回首頁</a>
        </div>
    </div>
    <div style="display: none">
        <script src='http://v7.cnzz.com/stat.php?id=155540&web_id=155540'
            language='JavaScript' charset='gb2312'></script>
    </div>
</body>
</html>      

SpringMVC中配置

<!-- shiro為內建springMvc 攔截異常 -->
<bean
    class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props> <!-- 這裡你可以根據需要定義N多個錯誤異常轉發 -->
            <prop key="org.apache.shiro.authz.UnauthorizedException">redirect:/failed</prop>
            <prop key="org.apache.shiro.authz.UnauthenticatedException">redirect:/login.jsp</prop> 
            <!--<prop key="java.lang.IllegalArgumentException">redirect:/error.jsp</prop> 
                參數錯誤(bizError.jsp) --> 
            <!--<prop key="java.lang.Exception">redirect:/error.jsp</prop> 其他錯誤為'未定義錯誤'(unknowError.jsp) -->
        </props>
    </property>
</bean>      

用沒有權限的賬号測試

好好程式設計-物流項目14【授權管理-shiro實作】

權限标簽在具體的業務場景中使用~