權(quán)限控制大體上分類:
① 在程序中,通過Subject編程方式進行權(quán)限控制
② 配置Filter 實現(xiàn)URL級別粗粒度權(quán)限控制(通過在權(quán)限表里查看該用戶是否存在URL地址判斷)
基于過濾器Filter 來實現(xiàn)
③ 配置代理 基于注解實現(xiàn)細粒度權(quán)限控制(通過在業(yè)務(wù)層添加@Permission("person_add")檢測客戶權(quán)限后決定是否執(zhí)行)
--補充一點就是基于自定義注解實現(xiàn)的權(quán)限控制,是交由>Spring管理 可以返回對象代理對象银觅,在訪問真實對象每個方法時结序,查詢數(shù)據(jù)庫判斷是否具有注解需要的權(quán)限骑歹,允許or攔截
④ 在頁面中使用 shiro自定義標(biāo)簽實現(xiàn) 頁面顯示權(quán)限控制
首先是shiro的體系結(jié)構(gòu)
Authentication :認(rèn)證(用戶登錄過程)
Authentization :授權(quán)(用戶具有哪些權(quán)限卖氨,在這些權(quán)限下能干什么)
Cryptography:數(shù)據(jù)安全加密
Session Manangement 會話管理
Web Integration web系統(tǒng)集成
Integrations 集成其他應(yīng)用、spring耀里、緩存框架
shiro運行的主要流程
application code --》 subject --》securityManager --》realm
applicationCode 用戶編寫的代碼
Subject 就是shiro管理的用戶
securityManager 安全管理器,是shiro權(quán)限控制核心對象拾氓,在編程時冯挎,只需要操作Subject方法,
底層調(diào)用SecurityManager方法咙鞍,無需直接編程操作SecurityManager
Realm應(yīng)用程序和安全數(shù)據(jù)之間的連接器房官,應(yīng)用程序 進行權(quán)限控制讀取安全數(shù)據(jù)(數(shù)據(jù)表、文件续滋、網(wǎng)絡(luò)翰守。。疲酌。)
關(guān)于粗粒度的權(quán)限控制配置的認(rèn)識:
思路蜡峰,首先是在web.xml中配置shiroFilter <filter>|<filtername>shiroFilter<filter-class>org.springframework.web.filter.DelegatingFilterProxy<filtermapping>|<filtername>shiroFilter<url-pattern>/*
然后為了單獨區(qū)分出shiro的配置文件,可以在spring原有的applicationContext.xml中配置一下,配置引入方式<import resource="applicationContext-shiro.xml">,接著在同級目錄下面創(chuàng)建applicationContext-shiro.xml文件在里面配置beans后朗恳,加上<bean id="shiroFilter"class="org.apache.shiro.web.shiroFilterFactoryBean">主要為了產(chǎn)生shirofilter 相關(guān)代碼塊湿颅,及其說明:
<bean id="shiroFilter" class=org.apache.shiro.spring.web.shiroFilterFactoryBean>
<!-- 安全管理器-->
<property name="securityManager" ref="securityManager">
<!-- 未認(rèn)證,跳轉(zhuǎn)到那個界面 -->
<property name="loginUrl" value="/login.html"/>
<!-- 成功登錄之后的界面
<property name="successUrl" value="/index.html"/>
<!-- 認(rèn)證后粥诫,沒有權(quán)限跳轉(zhuǎn)頁面 -->
<property name="unauthorizedUrl" value="/unauthorized.html">
<!-- shiro URL控制過濾器規(guī)則>
<property name="filterChainDefinitions">
<value>
/login.html* =anon --后面加*主要是考慮到可能帶有參數(shù)
/css/** =anon --兩顆星號(**)代表當(dāng)前目錄或子目錄下
/js/** =anon
/images/** =anon
/** =authc --除上面的情況其他資源都需要認(rèn)證后才能訪問
</value>
</property>
<bean>
<!--配置安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.defaultWebSecurityManager"><bean>
<!-- 后續(xù)處理器(主要是shiro的環(huán)境做一些后續(xù)處理)-->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor">
-- 參數(shù)含義
anon :未認(rèn)證可以訪問*
authc :認(rèn)證后可以訪問*
perms :需要特定的權(quán)限才能訪問*
roles :需要特定的角色才能訪問*
user : 需要特定的用戶才能訪問*
port : 需要特定的端口才能訪問
reset :根據(jù)指定HTTP請求訪問才能訪問
關(guān)于權(quán)限相關(guān)表的創(chuàng)建思路:
首先能確定的實體:用戶油航、角色、權(quán)限
用戶: 系統(tǒng)登錄用戶 User
權(quán)限: 描述權(quán)限信息(粗粒度權(quán)限控制怀浆,可能在權(quán)限表描述訪問URL信息)permission
角色: 方便用戶進行授權(quán)谊囚,角色就是權(quán)限的集合
E-R關(guān)系:
用戶 n---m 角色 n---m 權(quán)限 ==》建立5張表