1. 程式人生 > >項目一:第十二天 1、常見權限控制方式 2、基於shiro提供url攔截方式驗證權限 3、在realm中授權 5、總結驗證權限方式(四種) 6、用戶註銷7、基於treegrid實現菜單展示

項目一:第十二天 1、常見權限控制方式 2、基於shiro提供url攔截方式驗證權限 3、在realm中授權 5、總結驗證權限方式(四種) 6、用戶註銷7、基於treegrid實現菜單展示

eal 重復數 規則 認證通過 delete get 數據庫 filter 登陸

1 課程計劃

1、 常見權限控制方式

2、 基於shiro提供url攔截方式驗證權限

3、 realm中授權

4、 基於shiro提供註解方式驗證權限

5、 總結驗證權限方式(四種)

6、 用戶註銷

7、 基於treegrid實現菜單展示

2 常見的權限控制方式

2.1 url攔截實現權限控制

shiro基於過濾器實現的

技術分享圖片

2.2 註解方式實現權限控制

底層:代理技術

技術分享圖片

3 基於shirourl攔截方式驗權

技術分享圖片

<!-- 配置過濾器工廠 -->

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"

>

<!-- 註入安全管理器 -->

<property name="securityManager" ref="securityManager"></property>

<!-- 註入相關頁面

loginUrl :登陸頁面=用戶沒有登錄,訪問某個url(要求當前用戶登陸後可見)shiro框架跳轉登錄頁

successUrl;登陸成功頁面=可以不配(通過struts2框架跳轉)

unauthorizedUrl;權限不足頁面=用戶登陸後訪問url(要求必須有某個權限),如果用戶沒有權限,跳轉此頁面

-->

<property

name="loginUrl" value="/login.jsp"></property>

<property name="unauthorizedUrl" value="/unauthorized.jsp"></property>

<!-- 配置過濾器鏈:配置項目中url對應攔截規則(怎麽驗權) -->

<!--

等號左側代表項目url /** 項目中所有url

等號右側代表url經過哪個過濾器(shiro框架提供,使用簡稱即可)

authc:表單認證過濾器(訪問url,要求當前用戶必須認證通過後才有權限訪問)

anon:匿名過濾器(訪問

url,不需要登陸,不需要有權限==直接放行)

perms:權限授權過濾器(訪問url,要求當前用戶必須有某個權限)

roles:角色授權過濾器(訪問url,要求當前用戶必須有某個角色)

-->

<property name="filterChainDefinitions">

<value>

/js/** = anon

/images/** = anon

/css/** = anon

/login.jsp = anon

/validatecode.jsp* = anon

/userAction_login.action = anon

/pages/base/standard.jsp = perms["standard_page"]

<!-- /courierAction_delete.action = perms["courier_delete"] -->

/pages/base/courier.jsp = roles["admin"]

/** = authc

</value>

</property>

</bean>

訪問:使用權限過濾器perms 攔截到用戶請求後,而當前用戶沒有任何權限

技術分享圖片

4 realm中授權

通過url控制權限:當某個請求需要進行權限校驗,角色校驗時候,安全管理器會調用reaml中授權的方法;獲取用戶角色,以及權限。

/**

* @Description: 給用戶進行授權

*/

protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

System.out.println("給用戶授權");

//獲取當前用戶

User user = (User) SecurityUtils.getSubject().getPrincipal();

//數據庫結構 用戶-角色:多對多 角色-權限:多對多 可以根據用戶id查詢用戶權限

//TODO 給用戶授權只能是硬編碼 ,後期改為查詢數據庫

//創建簡單授權信息(包含當前用戶對應的權限,角色)

SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

//添加權限標識,註意這裏不能添加空白權限

//跟過perms濾器中,要求權限標識一樣

info.addStringPermission("courier_page");

info.addRole("admin");

return info;

}

1 基於shiro的註解方式驗權

技術分享圖片

1.1 開啟shiro註解支持

<!-- 開啟shiro註解支持 -->

<!--

自動代理:自動根據情況不同選擇代理技術

有接口:使用jdk動態代理==產生實現類代理對象

沒有接口:使用cglib動態代理==產生子類代理對象

設置自動代理:強制使用cglib動態代理產生代理對象==如果使用自動代理使用jdk動態代理。產生對象為null -->

<bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator">

<property name="proxyTargetClass" value="true"></property>

</bean>

<!-- 配置驗權切面:通知/增強(擴展功能代碼:驗證權限)+切點(shiro註解所在方法) -->

<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"></bean>

技術分享圖片

1.2 Service中方法上使用shiro註解

技術分享圖片

驗證當前用戶是否有權限,當沒有權限時候,shiro框架拋出異常;

解決:在Realm中給用戶進行授權;給當前用戶增加權限即可

技術分享圖片

技術分享圖片

1.3 使用struts2框架處理異常信息

技術分享圖片

技術分享圖片

技術分享圖片

2 總結權限控制方式

1、 url攔截:底層基於過濾器;在spring容器中配置過濾器鏈,配置項目中url對應攔截規則,註意:配置順序

技術分享圖片

2、 註解方式:底層基於動態代理

a) 第一步開啟shiro註解掃描 註意:強制使用cglib方式;事務註解也要使用cglib方式

b) 第二步:service層中方法上使用shrio註解

3、 Shiro頁面標簽控制

<%@ taglib uri="http://shiro.apache.org/tags" prefix="shiro"%>

技術分享圖片

4、 代碼級別

技術分享圖片

3 Shiro框架應用

技術分享圖片

1 基於shiro框架實現用戶註銷

1、 修改index.jsp頁面退出時的請求地址

技術分享圖片

2、 Action中提供logout方法

技術分享圖片

2 菜單的查詢

項目部署後,菜單數據,通過sql腳本直接添加到數據庫中。

技術分享圖片

菜單表自關聯;

技術分享圖片

1.1 treeGrid展示菜單數據

技術分享圖片

Treegrid要求的數據格式

技術分享圖片

1、 頁面:pages/system/menu.jsp

技術分享圖片

2、 創建菜單三層對象-完成註入

3、 問題一:由於要求返回json包含children 並且方式 出現No-session

技術分享圖片

4、 解決:將子節點數據立即加載

技術分享圖片

5、 json數據時候死循環

技術分享圖片

6、 問題:重復數據

Servie:

技術分享圖片

技術分享圖片

項目一:第十二天 1、常見權限控制方式 2、基於shiro提供url攔截方式驗證權限 3、在realm中授權 5、總結驗證權限方式(四種) 6、用戶註銷7、基於treegrid實現菜單展示