最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?Boot?Shiro?auto-configure工作流程詳解

 更新時間:2023年02月10日 11:20:50   作者:Samson_bu  
這篇文章主要為大家介紹了Spring?Boot?Shiro?auto-configure工作流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

01-Shiro 自動配置原理

Shiro 與 Spring Boot 集成可以通過 shiro-spring-boot-stater 實現(xiàn),并能完成必要類自動裝配。 實現(xiàn)方式是通過 Spring Boot 的自動配置機制,即 WEB-INF/spring.factories 中通過 EnableAutoConfiguration 指定了 6 個自動化配置類:

org.springframework.boot.autoconfigure.EnableAutoConfiguration = \
  org.apache.shiro.spring.config.web.autoconfigure.ShiroWebAutoConfiguration,\
  org.apache.shiro.spring.config.web.autoconfigure.ShiroWebFilterConfiguration,\
  org.apache.shiro.spring.config.web.autoconfigure.ShiroWebMvcAutoConfiguration,\
  org.apache.shiro.spring.boot.autoconfigure.ShiroBeanAutoConfiguration,\
  org.apache.shiro.spring.boot.autoconfigure.ShiroAutoConfiguration,\
  org.apache.shiro.spring.boot.autoconfigure.ShiroAnnotationProcessorAutoConfiguration

它們之間的關(guān)系為:

當(dāng)配置項 shiro.enabled = trueshiro.web.enabled = false 時,ShiroWeb*Configuration 配置不生效。 當(dāng) shiro.web.enabled = true 時,上述六個皆生效,不過 ShiroWebAutoConfiguration 上有注解 @AutoConfigureBefore(ShiroAutoConfiguration.class), 保證能在 ShiroAutoConfiguration 之前,使用 web 配置覆蓋 standalone 配置

02-自動配置類

Shiro 中的核心是 SecurityManager,它將 Authenticator、Authorizer、SessionManager 等關(guān)鍵模塊組合在一起。 在 ShiroWebAutoConfiguration 中包含了上述幾個核心模塊的默認(rèn)初始化過程。

對 Authenticator 來說(ShiroWebAutoConfiguration 返回的都是父類方法的內(nèi)容,所以下面我直接將方法體替換為父類的):

@Bean
@ConditionalOnMissingBean
@Override
protected AuthenticationStrategy authenticationStrategy() {
    return new AtLeastOneSuccessfulStrategy();
}
@Bean
@ConditionalOnMissingBean
@Override
protected Authenticator authenticator() {
    ModularRealmAuthenticator authenticator = new ModularRealmAuthenticator();
    authenticator.setAuthenticationStrategy(authenticationStrategy());
    return authenticator;
}

默認(rèn)情況下,使用的是 ModularRealmAuthenticator,策略類使用的事 AtLeastOneSuccessfulStrategy,即多個 Realms 時,至少一個成功則認(rèn)為是成功。

對 Authorizer 來說:

@Bean
@ConditionalOnMissingBean
@Override
protected Authorizer authorizer() {
    ModularRealmAuthorizer authorizer = new ModularRealmAuthorizer();
    if (permissionResolver != null) {
        // 負(fù)責(zé)從 permission 字符串里解析出 Permission 對象
        authorizer.setPermissionResolver(permissionResolver);  // 這兩個都是通過 @Autowired 注入進來的
    }
    if (rolePermissionResolver != null) {
        // 負(fù)責(zé)從 role 字符串里解析出 Permission 集合
        authorizer.setRolePermissionResolver(rolePermissionResolver);  // 這兩個都是通過 @Autowired 注入進來的
    }
    return authorizer;
}

對于 SessionManager 來說:

@Bean
@ConditionalOnMissingBean
@Override
protected SessionManager sessionManager() {
    if (useNativeSessionManager) {  // 從環(huán)境變量 shiro.userNativeSessionManager 取,默認(rèn)為 false
        // 省略了其他設(shè)置
        return new DefaultWebSessionManager();
    }
    return new ServletContainerSessionManager();
}

對于 SecurityManager 來說:

@Bean
@ConditionalOnMissingBean
@Override
protected SessionsSecurityManager securityManager(List<Realm> realms) {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setSubjectDAO(subjectDAO());
    securityManager.setSubjectFactory(subjectFactory());
    securityManager.setRememberMeManager(rememberMeManager());
    securityManager.setAuthenticator(authenticator());
    securityManager.setAuthorizer(authorizer());
    securityManager.setRealms(realms);
    securityManager.setSessionManager(sessionManager());
    securityManager.setEventBus(eventBus);
    if (cacheManager != null) {
    securityManager.setCacheManager(cacheManager);
    }
    return securityManager;
}

對于其他對象,例如 SubjectDAO/SubjectFactory、SessionDAO/SessionFactory/SessionManager、RememberMeManager、EventBus,在系統(tǒng)中屬于比較底層的輔助模塊,一般與業(yè)務(wù)牽扯比較小,所以通過情況下不需要修改。 我簡單介紹下它們的作用,以及 Shiro Web 應(yīng)用中使用得默認(rèn)類型:

  • SubjectFactory 有兩個默認(rèn)實現(xiàn),DefaultSubjectFactory 和 DefaultWebSubjectFactory 分別用來創(chuàng)建 standalone 和 Web 程序中的 Subject 對象。
  • SubjectDAO 有一個默認(rèn)實現(xiàn),DefaultSubjectDAO 負(fù)責(zé)將 Subject 對象存儲到其所屬的 Session 對象中。
  • RememberMeManager 負(fù)責(zé)將 Subject 的 principals 存儲到 cookie 中。
  • EventBus 是 Shiro 中的事件總線,負(fù)責(zé)在 Shiro 全聲明周期觸發(fā)特定事件或接受事件通知。
  • SessionDAO/SessionFactory/SessionManager 是與 Session 管理、持久化相關(guān)的模塊。

03-Filter 相關(guān)的配置類

ShiroWebFilterConfiguration 中定義了與 Servlet Filter 相關(guān)的對象。 對于 ShiroFilterFactoryBean,負(fù)責(zé)創(chuàng)建 shiroFilter 對象:

@Bean
@ConditionalOnMissingBean
@Override
protected ShiroFilterFactoryBean shiroFilterFactoryBean() {
    ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
    // 從環(huán)境變量中取
    filterFactoryBean.setLoginUrl(loginUrl);   // shiro.loginUrl
    filterFactoryBean.setSuccessUrl(successUrl); // shiro.successUrl
    filterFactoryBean.setUnauthorizedUrl(unauthorizedUrl); // shiro.unauthorizedUrl
    filterFactoryBean.setSecurityManager(securityManager);  // 由 @Autowired 注入
    filterFactoryBean.setShiroFilterConfiguration(shiroFilterConfiguration()); // 由 @Autowired 注入或默認(rèn)使用 ShiroFilterConfiguration
    filterFactoryBean.setGlobalFilters(globalFilters()); // 由 @Autowired 注入
    filterFactoryBean.setFilterChainDefinitionMap(shiroFilterChainDefinition.getFilterChainMap()); // 由 @Autowired 注入
    filterFactoryBean.setFilters(filterMap); // 由 @Autowired 注入
    return filterFactoryBean;
}

對于 filterShiroFilterRegistrationBean 來說,負(fù)責(zé)向 ServletContext 中注冊 shiroFilter 對象:

@Bean(name = REGISTRATION_BEAN_NAME)
@ConditionalOnMissingBean(name = REGISTRATION_BEAN_NAME)
protected FilterRegistrationBean<AbstractShiroFilter> filterShiroFilterRegistrationBean() throws Exception {
    FilterRegistrationBean<AbstractShiroFilter> filterRegistrationBean = new FilterRegistrationBean<>();
    filterRegistrationBean.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.FORWARD, DispatcherType.INCLUDE, DispatcherType.ERROR);
    filterRegistrationBean.setFilter((AbstractShiroFilter) shiroFilterFactoryBean().getObject());  // 有前面的 FactoryBean 創(chuàng)建
    filterRegistrationBean.setName(FILTER_NAME);  // shiroFilter
    filterRegistrationBean.setOrder(1);
    return filterRegistrationBean;
}

關(guān)于 globalFilters,默認(rèn)只有 InvalidRequestFilter:

@Bean(name = "globalFilters")
@ConditionalOnMissingBean
protected List<String> globalFilters() {
    return Collections.singletonList(DefaultFilter.invalidRequest.name());
}

通過前面的分析,如果業(yè)務(wù)需要針對不同的 URL 使用不同的 shiro-filter chain,可以通過自定義 shiroFilterChainDefinition 并將其注入都容器中即可,例如:

@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
    DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
    chainDefinition.addPathDefinition("/manage/index", "user");
    chainDefinition.addPathDefinition("/manage/logout", "logout");
    chainDefinition.addPathDefinition("/manage/**", "authc");
    // shiro 放行 swagger
    chainDefinition.addPathDefinition("/swagger-ui/**", "user");
    chainDefinition.addPathDefinition("/swagger-resources/**", "user");
    chainDefinition.addPathDefinition( "/v3/api-docs/**","user");
    chainDefinition.addPathDefinition("/**", "anon");
    return chainDefinition;
}

04-總結(jié)

今天,我介紹了 shiro-spring-boot-starter 中對 Shiro 進行自動化配置的細(xì)節(jié)。 通過對這些配置的了解,能夠在遇到具體的業(yè)務(wù)問題時修改特定模塊的實現(xiàn)方式,對理解和使用 Shiro 框架是非常必要的事情。 希望今天的內(nèi)容能對你有所幫助,更多關(guān)于Spring Boot Shiro auto-configure的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Java抽象類與普通類的區(qū)別

    詳解Java抽象類與普通類的區(qū)別

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識,文章圍繞著Java抽象類與普通類的區(qū)別展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • 詳解Java生成PDF文檔方法

    詳解Java生成PDF文檔方法

    這篇文章主要介紹了Java生成PDF文檔方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • Mybatis結(jié)果集映射與生命周期詳細(xì)介紹

    Mybatis結(jié)果集映射與生命周期詳細(xì)介紹

    結(jié)果集映射指的是將數(shù)據(jù)表中的字段與實體類中的屬性關(guān)聯(lián)起來,這樣 MyBatis 就可以根據(jù)查詢到的數(shù)據(jù)來填充實體對象的屬性,幫助我們完成賦值操作
    2022-10-10
  • Java環(huán)境中MyBatis與Spring或Spring MVC框架的集成方法

    Java環(huán)境中MyBatis與Spring或Spring MVC框架的集成方法

    和MyBatis類似,Spring或者Spring MVC框架在Web應(yīng)用程序的運作中同樣主要負(fù)責(zé)處理數(shù)據(jù)庫事務(wù),這里我們就來看一下Java環(huán)境中MyBatis與Spring或Spring MVC框架的集成方法
    2016-06-06
  • Java實現(xiàn)矩形碰撞檢測

    Java實現(xiàn)矩形碰撞檢測

    這篇文章主要為大家詳細(xì)介紹了Java實現(xiàn)矩形碰撞檢測,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-06-06
  • SpringBoot數(shù)據(jù)庫查詢超時配置詳解

    SpringBoot數(shù)據(jù)庫查詢超時配置詳解

    這篇文章主要介紹了SpringBoot數(shù)據(jù)庫查詢超時配置,超時配置可以避免長時間占用數(shù)據(jù)庫連接,提高系統(tǒng)的響應(yīng)速度和吞吐量,還可以快速的反饋可以提升用戶體驗,避免用戶因長時間等待而感到挫敗,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下
    2024-11-11
  • java中JSONObject轉(zhuǎn)換為HashMap(方法+main方法調(diào)用實例)

    java中JSONObject轉(zhuǎn)換為HashMap(方法+main方法調(diào)用實例)

    這篇文章主要介紹了java中JSONObject轉(zhuǎn)換為HashMap(方法+main方法調(diào)用實例),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • springboot整合minio實現(xiàn)文件存儲功能

    springboot整合minio實現(xiàn)文件存儲功能

    MinIO?是一個基于Apache?License?v2.0開源協(xié)議的對象存儲服務(wù),它兼容亞馬遜S3云存儲服務(wù)接口,非常適合于存儲大容量非結(jié)構(gòu)化的數(shù)據(jù),本文給大家介紹了springboot整合minio實現(xiàn)文件存儲功能,文中通過代碼示例介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Spring Boot之@Async異步線程池示例詳解

    Spring Boot之@Async異步線程池示例詳解

    在Spring Boot中,我們只需要通過使用@Async注解就能簡單的將原來的同步函數(shù)變?yōu)楫惒胶瘮?shù),下面這篇文章主要給大家介紹了關(guān)于Spring Boot之@Async異步線程池的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • idea項目實現(xiàn)移除和添加git

    idea項目實現(xiàn)移除和添加git

    本文指導(dǎo)讀者如何從官網(wǎng)下載并安裝Git,以及在IDEA中配置Git的詳細(xì)步驟,首先,用戶需訪問Git官方網(wǎng)站下載適合自己操作系統(tǒng)的Git版本并完成安裝,接著,在IDEA中通過設(shè)置找到git.exe文件以配置Gi
    2024-10-10

最新評論

宁明县| 清徐县| 独山县| 浦城县| 丘北县| 嘉兴市| 古交市| 铜陵市| 海淀区| 丹东市| 茌平县| 井陉县| 卓资县| 舞钢市| 乐昌市| 临夏市| 怀来县| 庄河市| 邯郸县| 阜康市| 乌恰县| 久治县| 泾源县| 珠海市| 永定县| 科技| 辽阳市| 兴和县| 堆龙德庆县| 巧家县| 登封市| 凤翔县| 莱芜市| 久治县| 兰溪市| 扎赉特旗| 阜康市| 漳浦县| 靖远县| 鹤山市| 合江县|