项目一:第十二天 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?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”:
?
?
?
?
轉載于:https://www.cnblogs.com/shan1393/p/9250720.html
總結
以上是生活随笔為你收集整理的项目一:第十二天 1、常见权限控制方式 2、基于shiro提供url拦截方式验证权限 3、在realm中授权 5、总结验证权限方式(四种) 6、用户注销7、基于treegrid实现菜单展示...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于服务器中毒的预防与治疗
- 下一篇: 6月 Python 开源项目 Top10