Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、受權、密碼和會話管理。使用Shiro的易於理解的API,您能夠快速、輕鬆地得到任何應用程序,從最小的移動應用程序到最大的網絡和企業應用程序。css
權限控制的方式前端
從類別上分,有兩大類:web
權限的控制級別spring
從控制級別(模型)上分:數據庫
URL級別的權限控制-粗粒度apache
在web.xml中配置一個過濾器filter,在過濾器中,對請求的地址進行解析,字符串截取:
url.substring()…把上下文前面的路徑都截取掉,剩下user_login.action。
過濾器代碼:
以經過查詢數據庫,來判斷,當前登陸用戶,是否能夠訪問user_login.action。
url級別控制,每次請求過程當中只控制一次 ,相比方法級別權限控制 是粗粒度的 !URL級別權限控制,基於Filter實現。編程
方法級別的權限控制-細粒度安全
aop面向切面的編程,在方法執行以前,進行權限判斷,若是沒有權限,拋出異常,終止方法的繼續運行。
自定義註解 在須要權限控制方法上, 添加須要的權限信息
代理 (Spring AOP ),在目標方法運行時 進行加強 ,經過反射技術獲取目標方法上註解中權限 , 查詢數據庫獲取當前登錄用戶具備權限,進行比較。
相比URL級別權限控制, 能夠控制到服務器端執行的每一個方法,一次請求中能夠控制屢次。服務器
頁面(顯示)級別的權限控制-自定義標籤網絡
頁面顯示的權限控制,一般是經過 自定義標籤來實現
數據級別的權限控制
在每條數據上增長一個字段,該字段記錄了權限的值。數據和權限綁定。
代碼,你在查詢數據的時候,須要去權限和用戶對應表中,經過當前登陸用戶的條件,查詢出你的數據權限。而後再將數據權限做爲一個條件,放到業務表中進行查詢。從而限制了數據的訪問。
權限系統的數據表設計
· 資源:用戶要訪問的目標,一般是服務中的程序或文件
· 權限:用戶具備訪問某資源的能力
· 角色:權限的集合,爲了方便給用戶受權。
· 用戶:訪問系統的’人’。
表對象實體:
表對象之間的關係:
完整的權限相關表:
URL級別權限控制包含:資源表、權限表、角色表、用戶表,以及相關關係(都是多對多),共7張表。
方法級別的權限控制包含:功能權限、角色、用戶,以及相關關係(都是多對多),共5張表。
但Apache Shiro框架支持的URL級別權限控制,是將資源和資源權限對應關係配置到了配置文件中,不須要表的支撐,只須要5張表了。
Apache Shiro權限控制
Apache Shiro 能夠不依賴任何技術使用, 能夠直接和web整合,一般在企業中和Spring 結合使用。
Authentication: 認證 — 用戶登陸
Authorization : 受權 —- 功能權限管理
經過引入Maven座標導入shiro
官方建議:不推薦直接引入shiro-all,依賴比較多,緣由怕有jar衝突。官方推薦根據須要單獨導入jar。
Shiro基本原理
Shiro的框架的體系結構:
Shiro權限控制流程的原理:
· 應用代碼 —- 調用Subject (shiro的Subject 就表明當前登錄用戶) 控制權限 —- Subject 在shiro框架內部 調用 Shiro SecurityManager 安全管理器 —– 安全管理器調用 Realm (程序和安全數據鏈接器 )。
· Subject要進行任何操做,都必需要調用安全管理器(對咱們來講是自動的)。
而安全管理器會調用指定的Realms對象,來鏈接安全數據。
· Realms用來編寫安全代碼邏輯和訪問安全數據,是鏈接程序和安全數據的橋樑。
URL級別的權限控制配置整合和url級別認證
配置過濾器web.xml:放在struts的前端控制器以前配置,但放在openEntitymanage以後。
[XML] 純文本查看 複製代碼
?
<!-- shiro權限過濾器 -->
<filter> <!-- 這裏的 filter-name 要和 spring 的 applicationContext-shiro.xml 裏的 org.apache.shiro.spring.web.ShiroFilterFactoryBean 的 bean name 相同 --> <filter-name>shiroSecurityFilter</filter-name> <!-- spring的代理過濾器類:之前的過濾器 --> <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> <init-param> <!-- 該值缺省爲false,表示生命週期由SpringApplicationContext管理,設置爲true則表示由ServletContainer管理 --> <param-name>targetFilterLifecycle</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>shiroSecurityFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
配置ApplicationContext.xml:(shiro權限控制過濾器+ shiro安全管理器)
<!-- shiro權限控制過濾器bean --> <bean id="shiroSecurityFilter" 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 鏈接約束配置(URL級別的權限控制),即URL和filter的關係,URL控制規則:路徑=規則名 --> <property name="filterChainDefinitions"> <value> <!--按需求配置--> /login.jsp = anon /validatecode.jsp = anon /js/** = anon /css/** = anon /images/** = anon /user_login.action* = anon /page_base_staff.action = anon /page_base_region.action = perms["user"] /page_base_subarea.action = roles["operator"] /** = authc </value> </property> </bean> <!-- shiro安全管理器 --> <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager"> <!-- 注入 Realm鏈接安全數據--> </bean>
配置shiroFilter 實際上是一個過濾器鏈,含有10個Filter(校驗功能)。
經常使用:
認證
受權: