(1)基於(攔截器Filter)url粗粒度的控制
在數據庫中存放用戶、權限、訪問
url對應的地址,查詢數據庫判斷
用戶當前具有權限,是否包含這個
url,如果包含則允許訪問,如果
不包含則提示權限不足;
(2)基於(aop)在方法上添加註解的細粒度控制
可以代理、自定義註解實現,訪問目標
對象的方法,在方法上添加權限註解
信息,對目標對象創建代理對象,訪問真實
對象先訪問代理對象,在代理對象查詢數據庫
時判斷是否具有註解上描述需要的權限,若具有
權限,則允許訪問,不具有權限,則攔截訪問,
提示權限不足;
2、權限控制相關的數據表
(1)實體:用戶 角色 權限
(2)權限:描述權限信息(粗粒度權限控制,可能在權限表描述訪問資源的url信息)
(3)角色(role):方便用戶進行授權,角色就是權限的集合
(4)menu菜單:爲了方便進行動態菜單管理,
爲不同的用戶定製不同的系統菜單,
不同的用戶系統菜單,可以根據用戶角色進行管理
多對多 多對多
①用戶<————————————>角色<——————————————>權限 一共5張表
多對多
②角色<————————————————>菜單
3、shiro的使用流程:
(1)導入maven座標
(2)配置web.xml
<!-- shiro security filter -->
<!--Shirofilter-->
<filter>
<filter-name>shiroFilter</filter-name>?
<filter-class>
org.springframework.web.filter.DelegatingFilterProxy
</filter-class>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
(3)配置applicationContext-shiro.xml文件
<bean id="shiroFilter"
class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<!-- shiro 的核心安全接口 -->
<property name="securityManager" ref="securityManager" />
<!-- 要求登錄時的鏈接 -->
<property name="loginUrl" value="/login.jsp" />
<!-- 登陸成功後要跳轉的連接 -->
<property name="successUrl" value="/index.jsp" />
<!-- 未授權時要跳轉的連接 -->
<property name="unauthorizedUrl" value="/unauthorized.jsp" />
<!-- shiro 連接約束配置 -->
<propery name="filterChainDefinitions">
<value>
/login = authc
/logout = logout
/resource/** = anon
</value>
</property>
</bean>
<bean id="securityManager"
class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
</bean>
<bean id="lifecycleBeanPostProcessor"
class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
</bean>
anon 未認證就可以訪問
authc 認證後纔可以訪問
perms 需要特定權限纔可以訪問
roles 需要特定角色纔可以訪問
user 需要特定用戶纔可以訪問
port 需要特定端口纔可以訪問
reset 根據特定的http纔可以訪問
(4)根據shiro的執行流程:
應用程序--subject--securityManager---realm---安全數據
3、shiro的realm的認證和授權的實現
4、配置註解實現業務層方法級別的權限控制
(1)在applicationContext-shiro.xml文件中配置
<!-- 開啓shiro註解模式 -->
<bean
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator"
depends-on="lifecycleBeanPostProcessor" >
<!-- 使用cglb代理 -->
<property name="proxyTargetClass" value="true" />
</bean>
<bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
<property name="securityManager" ref="securityManager"/>
</bean>
(2)基於註解的授權實現
@ RequiresAuthentication
@ RequiresGuest
@RequiresPermissions("account:create")
@RequiresRoles
@ RequiresUser
5、shiro權限控制小結:
(1)URL級別粗粒度權限控制
①在web.xml文件的shiroFilter攔截/*
②在spring的applicationContext*.xml文件
中配置同名bean,配置filterChainDefintions攔截
xxx.html*=anno 未登錄可以訪問
xxx.html*=authc 必須登錄才能訪問
xxx.html*=perms[權限] 需要特定權限才能訪問
xxx.html*=roles[角色] 需要特定角色才能訪問
(2)在spring的applicationContext.xml中配置
spring aop纔對spring管理bean對象開啓shiro註解支持
@RequiresPermissions(權限) 需要特定權限纔可以訪問
@RequiresRoles(角色) 需要特定角色纔可以訪問
@requiresAuthentication 需要認證纔可以訪問
(3)通過shiro自定義標籤,實現頁面元素顯示控制
<shiro:authenticated> 登錄後才能訪問
<shiro:hasPermission name="abc"> 需要特定權限才能訪問
<shiro:hasRole name="abc" > 需要特定角色纔可以訪問
(4)在程序中通過代碼 判斷用戶是否具有指定權限(不常用,有代碼侵入性,不推薦使用)
6、補充:權限表達式 “:”代表子權限
①權限: courier 包含courier:add 、 courier:list 、courier:*
②如果用戶具有父權限,則可以操作所有子權限功能
例如:權限courier:list 包含courier:list:10