項目一:第十二天 1、常見權限控制方式 2、基於shiro提供url攔截方式驗證權限 3、在realm中授權 5、總結驗證權限方式(四種) 6、用戶註銷7、基於treegrid實現菜單展示
1 課程計劃
1、 常見權限控制方式
2、 基於shiro提供url攔截方式驗證權限
3、 在realm中授權
4、 基於shiro提供註解方式驗證權限
5、 總結驗證權限方式(四種)
6、 用戶註銷
7、 基於treegrid實現菜單展示
2 常見的權限控制方式
2.1 url攔截實現權限控制
shiro基於過濾器實現的
2.2 註解方式實現權限控制
底層:代理技術
3 基於shiro的url攔截方式驗權
<!-- 配置過濾器工廠 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean"
<!-- 註入安全管理器 -->
<property name="securityManager" ref="securityManager"></property>
<!-- 註入相關頁面
loginUrl :登陸頁面=用戶沒有登錄,訪問某個url(要求當前用戶登陸後可見)shiro框架跳轉登錄頁
successUrl;登陸成功頁面=可以不配(通過struts2框架跳轉)
unauthorizedUrl;權限不足頁面=用戶登陸後訪問url(要求必須有某個權限),如果用戶沒有權限,跳轉此頁面
-->
<property
<property name="unauthorizedUrl" value="/unauthorized.jsp"></property>
<!-- 配置過濾器鏈:配置項目中url對應攔截規則(怎麽驗權) -->
<!--
等號左側代表項目url /** 項目中所有url
等號右側代表url經過哪個過濾器(shiro框架提供,使用簡稱即可)
authc:表單認證過濾器(訪問url,要求當前用戶必須認證通過後才有權限訪問)
anon:匿名過濾器(訪問
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實現菜單展示