shiro權限控制

Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、受權、密碼和會話管理。使用Shiro的易於理解的API,您能夠快速、輕鬆地得到任何應用程序,從最小的移動應用程序到最大的網絡和企業應用程序。css

權限控制的方式前端

從類別上分,有兩大類:web

  • 認證:你是誰?–識別用戶身份。
  • 受權:你能作什麼?–限制用戶使用的功能。

權限的控制級別spring

從控制級別(模型)上分:數據庫

  • URL級別-粗粒度
  • 方法級別-細粒度
  • 頁面級別-自定義標籤(顯示)
  • 數據級別-最細化的(數據)

URL級別的權限控制-粗粒度apache

在web.xml中配置一個過濾器filter,在過濾器中,對請求的地址進行解析,字符串截取:
url.substring()…把上下文前面的路徑都截取掉,剩下user_login.action。
過濾器代碼:
以經過查詢數據庫,來判斷,當前登陸用戶,是否能夠訪問user_login.action。
url級別控制,每次請求過程當中只控制一次 ,相比方法級別權限控制 是粗粒度的 !URL級別權限控制,基於Filter實現。編程

方法級別的權限控制-細粒度安全

aop面向切面的編程,在方法執行以前,進行權限判斷,若是沒有權限,拋出異常,終止方法的繼續運行。
自定義註解 在須要權限控制方法上, 添加須要的權限信息
代理 (Spring AOP ),在目標方法運行時 進行加強 ,經過反射技術獲取目標方法上註解中權限 , 查詢數據庫獲取當前登錄用戶具備權限,進行比較。
相比URL級別權限控制, 能夠控制到服務器端執行的每一個方法,一次請求中能夠控制屢次。服務器

頁面(顯示)級別的權限控制-自定義標籤網絡

頁面顯示的權限控制,一般是經過 自定義標籤來實現

數據級別的權限控制

在每條數據上增長一個字段,該字段記錄了權限的值。數據和權限綁定。
代碼,你在查詢數據的時候,須要去權限和用戶對應表中,經過當前登陸用戶的條件,查詢出你的數據權限。而後再將數據權限做爲一個條件,放到業務表中進行查詢。從而限制了數據的訪問。

權限系統的數據表設計

· 資源:用戶要訪問的目標,一般是服務中的程序或文件
· 權限:用戶具備訪問某資源的能力
· 角色:權限的集合,爲了方便給用戶受權。
· 用戶:訪問系統的’人’。
表對象實體:

  • 用戶(User)表:訪問系統的用戶,好比用戶登陸要用
  • 權限(Function)表:系統某個功能容許訪問而對應的權限
  • 角色(Role)表:角色是權限的集合(權限組),方便用戶受權。

表對象之間的關係:

  • 用戶和角色關係表:一個用戶對應N個角色,一個角色能夠授予N個用戶—》多對多關係
  • 角色和權限關係表:一個角色包含N個權限,一個權限能夠屬於N個角色—》多對多關係

完整的權限相關表:
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(校驗功能)。

經常使用:
認證

  • anon不用認證(登陸)就能訪問(單詞注意大小寫)
  • authc: 須要認證(登陸)才能使用,例如/admins/user/**=authc,沒有參數。

受權:

  • perms:須要擁有某權限才能使用,如具體容許的權限:/page_base_region.action =perms[「user」],若是要訪問該action,當前登陸用戶必須擁有user名字的權限。
  • roles:須要擁有某角色才能使用,如具體容許的角色:/page_base_subarea.action = roles[「operator」]若是要訪問該action,當前用戶必須擁有operator權限。
相關文章
相關標籤/搜索