Shiro 進階之從數據庫讀取過濾器鏈

我們之前使用過濾器鏈都是在 XML 中手動添加和維護的,本章我們來介紹下如何從數據庫讀取這些過濾器配置,這樣做的好處是便於維護,且可以通過程序來添加過濾器配置,因爲我們只需要添加一條記錄到數據庫即可。

回顧下,之前我們是這樣配置的:

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManager"/>
        <!-- 登錄頁面, 未認證時訪問需要認證或授權的資源會自動跳轉到此頁面 -->
        <property name="loginUrl" value="/login.jsp"/>
        <!-- 登錄成功頁面 -->
        <property name="successUrl" value="/index.jsp"/>
        <!-- 登錄後, 訪問未授權的資源會跳轉到此頁面 -->
        <property name="unauthorizedUrl" value="/unauthorized.jsp"/>
        <property name="filterChainDefinitions">
            <value>
                /login.jsp = anon
                /login = anon
                /user.jsp = anyRoles[user, admin]
                /userList.jsp = perms[select:delete]
                /logout = logout
                /** = authc
            </value>
        </property>
    </bean>

主要是 filterChainDefinitions 屬性,現在我們將其修改爲:

<property name="filterChainDefinitionMap" ref=""/>

我們點開 ShiroFilterFactoryBeanfilterChainDefinitionMap 屬性來看下,它是 Map 類型的:

public void setFilterChainDefinitionMap(Map<String, String> filterChainDefinitionMap) {
	this.filterChainDefinitionMap = filterChainDefinitionMap;
}

這樣我們就可以創建一個類,他從數據庫讀取權限數據組成一個 Map 類型作爲返回值即可,這裏我們用實例工廠來實現:

import java.util.LinkedHashMap;

public class FilterChainDefinitionMapBuilder {

    public LinkedHashMap<String, String> buildFilterChainDefinitionMap() {
        LinkedHashMap<String, String> map = new LinkedHashMap<>();

        // 這裏根據自己使用的數據庫查詢, 將值 put 到 Map 中.

        return map;
    }
}

使用 LinkedHashMap 的原因是爲了保證插入順序有序,具體連接數據庫和查詢代碼這裏就不在演示了,自行根據項目使用的 ORM 框架來實現。

最後的配置文件是這樣的:

<!-- shiro 過濾器, 要與 web.xml 中的 Filter Name 相同-->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager"/>
    <!-- 登錄頁面, 未認證時訪問需要認證或授權的資源會自動跳轉到此頁面 -->
    <property name="loginUrl" value="/login.jsp"/>
    <!-- 登錄成功頁面 -->
    <property name="successUrl" value="/index.jsp"/>
    <!-- 登錄後, 訪問未授權的資源會跳轉到此頁面 -->
    <property name="unauthorizedUrl" value="/unauthorized.jsp"/>

    <property name="filterChainDefinitionMap" ref="filterChainDefinitionMap"/>
</bean>

<bean id="filterChainDefinitionMap" factory-bean="filterChainDefinitionMapBuilder" factory-method="buildFilterChainDefinitionMap"/>

<bean id="filterChainDefinitionMapBuilder" class="im.zhaojun.factory.FilterChainDefinitionMapBuilder"/>

本章代碼地址 : https://github.com/zhaojun1998/Premission-Study/tree/master/Permission-Shiro-12/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章