[Shiro]Shiro整合Spring Boot 自動化配置

Spring Boot 簡化了spring大量的xml配置,使用了Java Config的配置,同時又提供了自動化配置工具。在引入新的組件時,只需要在配置文件上添加少量配置即可。如果需要更高自定義度配置,再添加極少的Java Config文件就好了。

簡單介紹

廢話

最近項目上要改造為Spring Boot,權(quán)限是本人使用的Shiro管理的。最快的辦法是把Xml換成Java Config,但是配置也是不少。在網(wǎng)上查帖子也全是這樣做的。本人想,Shiro有Spring Boot的自動化組件嗎?打開Shiro的官網(wǎng)并沒有找到,在Shiro的github的上,發(fā)現(xiàn)了它的自動化組件,有非Web環(huán)境的和Web環(huán)境的。在百度上沒找到關(guān)于shiro-starter的使用,就想著寫寫博客講一下。

Shiro的Spring Boot 組件

屏幕快照 2017-08-28 21.49.32.png

看了源碼,shiro-spring-boot-web-starter依賴了shiro-spring-boot-starter,本人就說說shiro-spring-boot-web-starter的使用。

在resources/META-INF/additional-spring-configuration-metadata.json文件中,描述了Shiro提供的配置項。

{
  "groups": [
    {
      "name": "shiro"
    },
  ],
  "properties": [

    {
      "name": "shiro.web.enabled",
      "type": "java.lang.Boolean",
      "description": "shiro 自動化組件開關(guān),默認值是打開",
      "defaultValue": true
    },
    {
      "name": "shiro.loginUrl",
      "type": "java.lang.String",
      "description": "配置shiro的認證(登錄)Url",
      "defaultValue": "/login.jsp"
    },
    {
      "name": "shiro.successUrl",
      "type": "java.lang.String",
      "description": "配置shiro的認證(登錄)成功后跳轉(zhuǎn)的Url",
      "defaultValue": "/"
    },
    {
      "name": "shiro.unauthorizedUrl",
      "type": "java.lang.String",
      "description": "配置shiro的未授權(quán)跳轉(zhuǎn)的Url,http狀態(tài)碼403",
      "defaultValue": null
    },
    {
      "name": "shiro.sessionManager.sessionIdCookieEnabled",
      "type": "java.lang.String",
      "description": "是否使用cookie存儲session的id",
      "defaultValue": true
    },
    {
      "name": "shiro.sessionManager.sessionIdUrlRewritingEnabled",
      "type": "java.lang.String",
      "description": "通過URL參數(shù)啟用或禁用會話跟蹤。 如果您的網(wǎng)站需要Cookie,建議您禁用此功能。",
      "defaultValue": true
    }
  ]
}

配置項描述文件,在

屏幕快照 2017-08-28 22.39.57.png

這個包里也有一部分配置。

全部配置

本人將所有的配置整理列出來

shiro: 
  web: 
    ## 開啟shiro web自動化配置,默認開啟
    enabled: true
  loginUrl: /login.jsp
  successUrl: /
  ## 必須要配置為授權(quán)的url,否則在無權(quán)限的情況下,會找不到未授權(quán)url,導(dǎo)致找不到安全管理器(SecurityManager)
  unauthorizedUrl: null
  ## session管理方式,true使用shiro提供的session管理,false則使用servlet提供的session管理
  userNativeSessionManager: false
  ## 會話管理
  sessionManager: 
    sessionIdCookieEnabled: true
    sessionIdUrlRewritingEnabled: true
    deleteInvalidSessions: true
    cookie: 
      name: JSESSIONID
      maxAge: -1
      domain: null
      path: null
      secure: false
  ## 記住我管理
  rememberMeManager: 
    cookie: 
      name: rememberMe
      ## 默認一年
      maxAge: 60 * 60 * 24 * 365
      domain: null
      path: null
      secure: false
    

使用

下面就講講怎么使用

導(dǎo)入pom

        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring-boot-web-starter</artifactId>
            <version>1.4.0</version>
        </dependency>

添加配置

shiro:
  loginUrl: /login.html
  unauthorizedUrl: /unauthorized
  ## 使用shiro管理會話
  userNativeSessionManager: true
  sessionManager:
    sessionIdUrlRewritingEnabled: false
    cookie:
      name: sid

增加配置類

package cc.yihy.shiro.demo.config;

import org.apache.shiro.realm.Realm;
import org.apache.shiro.realm.text.TextConfigurationRealm;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * @Package: cc.yihy.shiro.demo.config
 * @date: 2017/8/28 23:21
 * @author: Yihy
 * @version: V1.0
 * @Description:
 */
@Configuration
public class ShiroConfig {

    /**
     * 驗證用戶
     * 可以聲明多個Realm Bean,Shiro都會把它注入的
     * @return
     */
    @Bean
    public Realm realm() {
        TextConfigurationRealm realm = new TextConfigurationRealm();
        //添加兩個用戶
        //joe.coder=password 角色 user
        //jill.coder=password 角色 admin
        realm.setUserDefinitions("joe.coder=password,user\n" +
                "jill.coder=password,admin");

        //設(shè)置角色admin的權(quán)限是read,write
        //設(shè)置角色user的權(quán)限是read
        realm.setRoleDefinitions("admin=read,write\n" +
                "user=read");
        realm.setCachingEnabled(true);

        return realm;
    }

    /**
     * 配置shiro的url權(quán)限
     *
     * @return
     */
    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
        chainDefinition.addPathDefinition("/login.html", "authc"); // need to accept POSTs from the login form
        chainDefinition.addPathDefinition("/logout", "logout");
        chainDefinition.addPathDefinition("/account-info", "perms[write]");
        chainDefinition.addPathDefinition("/account-info1", "roles[admin]");
        return chainDefinition;
    }
}

這樣就完成了Shiro的自動化配置。

補充 需要自定義shiro的Filter

讓ShiroConfig繼承ShiroWebFilterConfiguration(org.apache.shiro.spring.config.web.autoconfigure.ShiroWebFilterConfiguration)類,重寫ShiroFilterFactoryBean方法,就可以達到目的。

    @Override
    protected ShiroFilterFactoryBean shiroFilterFactoryBean() {
        ShiroFilterFactoryBean factoryBean = super.shiroFilterFactoryBean();
        Map<String,Filter> filterMap = new LinkedHashMap<>();
        //添加自定義的Filter,這里我隨便new了一個filter
        filterMap.put("anyrole",new UserFilter());
        factoryBean.setFilters(filterMap);
        return factoryBean;
    }

小結(jié)

今天看的shiro的自動化組件,晚上寫博文,本人shiro用的還不錯,spring boot的東西也是用了很長時間。寫博文的時候,同時也是頭一次寫了shiro自動化組件的demo。在測試授權(quán)的時候,當(dāng)無權(quán)限的時候,一直給我報安全管理器找不到的問題。檢查測試了半天,才發(fā)現(xiàn)是未授權(quán)url未配置的原因。

使用shiro的自動化配置,可以輕易的完成了shiro的配置。雖然很好,但也隱藏了很多的細節(jié),以至于知道怎么用,出了問題就不知道怎么解決。建議有空還是看看底層如何實現(xiàn)的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容