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

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

简单介绍

废话

最近项目上要改造为Spring Boot,权限是本人使用的Shiro管理的。最快的办法是把Xml换成Java Config,但是配置也是不少。在网上查帖子也全是这样做的。本人想,Shiro有Spring Boot的自动化组件吗?打开Shiro的官网并没有找到,在Shiro的github的上,发现了它的自动化组件,有非Web环境的和Web环境的。在百度上没找到关于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 自动化组件开关,默认值是打开",
      "defaultValue": true
    },
    {
      "name": "shiro.loginUrl",
      "type": "java.lang.String",
      "description": "配置shiro的认证(登录)Url",
      "defaultValue": "/login.jsp"
    },
    {
      "name": "shiro.successUrl",
      "type": "java.lang.String",
      "description": "配置shiro的认证(登录)成功后跳转的Url",
      "defaultValue": "/"
    },
    {
      "name": "shiro.unauthorizedUrl",
      "type": "java.lang.String",
      "description": "配置shiro的未授权跳转的Url,http状态码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参数启用或禁用会话跟踪。 如果您的网站需要Cookie,建议您禁用此功能。",
      "defaultValue": true
    }
  ]
}

配置项描述文件,在

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

这个包里也有一部分配置。

全部配置

本人将所有的配置整理列出来

shiro: 
  web: 
    ## 开启shiro web自动化配置,默认开启
    enabled: true
  loginUrl: /login.jsp
  successUrl: /
  ## 必须要配置为授权的url,否则在无权限的情况下,会找不到未授权url,导致找不到安全管理器(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
    

使用

下面就讲讲怎么使用

导入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");

        //设置角色admin的权限是read,write
        //设置角色user的权限是read
        realm.setRoleDefinitions("admin=read,write\n" +
                "user=read");
        realm.setCachingEnabled(true);

        return realm;
    }

    /**
     * 配置shiro的url权限
     *
     * @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;
    }

小结

今天看的shiro的自动化组件,晚上写博文,本人shiro用的还不错,spring boot的东西也是用了很长时间。写博文的时候,同时也是头一次写了shiro自动化组件的demo。在测试授权的时候,当无权限的时候,一直给我报安全管理器找不到的问题。检查测试了半天,才发现是未授权url未配置的原因。

使用shiro的自动化配置,可以轻易的完成了shiro的配置。虽然很好,但也隐藏了很多的细节,以至于知道怎么用,出了问题就不知道怎么解决。建议有空还是看看底层如何实现的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 156,907评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,546评论 1 289
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 106,705评论 0 238
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,624评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 51,940评论 3 285
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,371评论 1 210
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,672评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,396评论 0 195
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,069评论 1 238
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,350评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,876评论 1 256
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,243评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,847评论 3 231
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,004评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,755评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,378评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,266评论 2 259

推荐阅读更多精彩内容