Shiro基本概念及與Spring集成

apache shiro 基本架構

在這裏插入圖片描述
Subject:當前登錄人的一個安全視圖。代碼可以從對象中獲取登錄信息。
SecurityManager:架構的核心,組織管理所有的Subject。
Realms:用戶自定義,提供獲取用戶信息,認證信息。

下面是更加詳細的架構圖:
在這裏插入圖片描述

apache shiro 與Spring boot集成

spring boot starter

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.5.1</version>
        </dependency>

通過configuration配置shiro。


@Configuration

public class ShiroConfig {

    @Bean
    public SecurityManager securityManager() {
        return new DefaultWebSecurityManager();

    }


    @Bean
    public ShiroSecurityRealm myRealm() {
        return new ShiroSecurityRealm();

    }

    /**
     * 配置ShiroFilterFactoryBean
     *
     * @param securityManager
     * @return
     */

    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {

        System.out.println("執行 ShiroFilterFactoryBean shiroFilter");

        ShiroFilterFactoryBean shiroFilterFactoryBean = new 
ShiroFilterFactoryBean();

        shiroFilterFactoryBean.setSecurityManager(securityManager);

        shiroFilterFactoryBean.setLoginUrl("/public/login");
        shiroFilterFactoryBean.setSuccessUrl("/");
       
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();

        filterChainDefinitionMap.put("/logout", "logout");

        filterChainDefinitionMap.put("/public/**", "anon");

        filterChainDefinitionMap.put("/authc/**", "authc");

        filterChainDefinitionMap.put("/**", "authc");

shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

        return shiroFilterFactoryBean;

    }

    @Bean
    public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
        return new LifecycleBeanPostProcessor();

    }

    @Bean
    public AuthorizationAttributeSourceAdvisor 
authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor 
= new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }
}

註解

Spring中,在Controller上添加RequiresPermissions,RequiresRoles註解,從而爲接口添加訪問權限限制。

權限校驗:

@RequiresPermissions("account:create")
public void openAccount( Account acct ) { 
    //create the account
}

角色校驗:

@RequiresRoles( "teller" ) 
public void openAccount( Account acct ) { 
    //do something in here that only a teller //should do
}

shiro 配置

shiro有默認的實現,能夠讀取ini配置。本文沒有采用這種方式,而是直接在configuration中配置。

# =======================
# Shiro INI configuration
# =======================

[main]
# Objects and their properties are defined here,
# Such as the securityManager, Realms and anything
# else needed to build the SecurityManager

[users]
# The 'users' section is for simple deployments
# when you only need a small number of statically-defined
# set of User accounts.

[roles]
# The 'roles' section is for simple deployments
# when you only need a small number of statically-defined
# roles.

[urls]
# The 'urls' section is used for url-based security
# in web applications.  We'll discuss this section in the
# Web documentation

main中配置realms以及SecurityManager。
urls中配置路徑、文件的權限。

默認Filter

Filter Name 描述
anon org.apache.shiro.web.filter.authc.AnonymousFilter 需要登錄,但不做權限校驗。
authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter 基於表單的驗證。對於訪問進行權限校驗。如果不通過則redirect到loginurl。
authcBasic org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter 需要用戶登錄才能繼續訪問資源。如果用戶沒有登錄,則通過要求用戶通過基本的HTTP協議進行登錄。登錄完成後,會繼續訪問之前的url。
logout org.apache.shiro.web.filter.authc.LogoutFilter 接到這個請求,會直接logout當前的subject,並重定向到配置的 redirectRUL。
noSessionCreation org.apache.shiro.web.filter.session.NoSessionCreationFilter 這是一個非常有用的過濾器,可以放在任何過濾器鏈的前面,這些過濾器鏈可能會導致REST、SOAP或其他不打算參與會話的服務調用。
perms org.apache.shiro.web.filter.authz.PermissionsAuthorizationFilter 如果當前用戶具有由映射值指定的權限,則允許訪問;如果用戶沒有指定的所有權限,則拒絕訪問。
port org.apache.shiro.web.filter.authz.PortFilter 要求請求位於特定端口上的篩選器,如果不是,則重定向到該端口上的相同URL。
rest org.apache.shiro.web.filter.authz.HttpMethodPermissionFilter HTTP的method(GET,POST等)轉成rest的方法(read,create等)。
roles org.apache.shiro.web.filter.authz.RolesAuthorizationFilter 根據角色過濾
ssl org.apache.shiro.web.filter.authz.SslFilter https
user org.apache.shiro.web.filter.authc.UserFilter 用戶已經登錄,或者設置了remember me。判斷條件: subject.getPrincipal() != null.

anon

用戶需要登錄才能訪問此資源,但是不會做權限校驗。
用例:

[urls]
/user/signup/** = anon
/user/** = authc>

user/signup路徑下所有的資源登錄後都可以訪問,但是/user/目錄下其他的資源,都需要做權限校驗。

noSessionCreation

執行過程:
如果一個Subject還沒有session,那麼將會禁止對於subject.getSession() 和subject.getSession(true)的調用。如果在期間有調用,則拋出異常。
如果在filter調用之前Subject已經有Session了,或者在應用的其他地方創建了session,或者在此filter之前的filter創建了session,對於此filter沒有影響。

rest

http method 和rest 原語的映射規則。
在這裏插入圖片描述

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