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

[Shiro]Shiro整合Spring Boot 自动化配置,第1张

最近项目上要改造为Spring Boot,权限是本人使用的Shiro管理的。最快的办法是把Xml换成Java Config,但是配置也是不少。在网上查帖子也全是这样做的。本人想,Shiro有Spring Boot的自动化组件吗?打开Shiro的官网并没有找到,在Shiro的github的上,发现了它的自动化组件,有非Web环境的和Web环境的。在百度上没找到关于shiro-starter的使用,就想着写写博客讲一下。

看了源码,shiro-spring-boot-web-starter依赖了shiro-spring-boot-starter,本人就说说shiro-spring-boot-web-starter的使用。

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

配置项描述文件,在

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

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

下面就讲讲怎么使用

这样就完成了Shiro的自动化配置。

让ShiroConfig继承ShiroWebFilterConfiguration( org.apache.shiro.spring.config.web.autoconfigure.ShiroWebFilterConfiguration )类,重写ShiroFilterFactoryBean方法,就可以达到目的。

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

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

principals即主体的标识属性,可以是任何东西,如用户名、邮箱等,唯一即可。credentials是证明/凭证,即只有主体知道的安全值,如密码/数字证书等。最常见的principals和credentials组合就是用户/密码了。

下面我们来看一个认证的例子,由于我们是用maven构建的实例,所以需要在pom.xml中添加依赖:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.11-20120805-1225</version>

</dependency>

<dependency>

<groupId>commons-logging</groupId>

<artifactId>commons-logging</artifactId>

<version>1.1.3</version>

</dependency>

<dependency>

<groupId>org.apache.shiro</groupId>

<artifactId>shiro-core</artifactId>

<version>1.2.3</version>

</dependency>

另外,准备一些用户微分凭据,shiro.ini:

?

1

2

3

[users]

zhang=123

wang=123

测试用例:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

package org.shiro

import junit.framework.Assert

import org.apache.shiro.SecurityUtils

import org.apache.shiro.authc.AuthenticationException

import org.apache.shiro.authc.UsernamePasswordToken

import org.apache.shiro.config.IniSecurityManagerFactory

import org.apache.shiro.subject.Subject

import org.apache.shiro.util.Factory

import org.junit.Test

public class ShiroTest1{

@Test

public void shiro_test1(){

//获取SecurityManager工厂,此处使用ini配置文件初始化SecurityManager

Factory<org.apache.shiro.mgt.SecurityManager>factory =

new IniSecurityManagerFactory("classpath:shiro.ini")

//得到SecurityManager实例并绑定给SecurityUtils

org.apache.shiro.mgt.SecurityManager securityManager = factory.getInstance()

SecurityUtils.setSecurityManager(securityManager)

//得到Subject及创建用户名/密码身份验证Token(即用户身份/凭证)

Subject subject = SecurityUtils.getSubject()

UsernamePasswordToken token = new UsernamePasswordToken("zhang","123")

try {

subject.login(token)

} catch (AuthenticationException e) {

System.err.println(e.getMessage())

}

//断言用户已经登录

Assert.assertEquals(true, subject.isAuthenticated())

//退出

subject.logout()

}

}

从上例中,我们可以看到shiro的身份认证流程,如果还没有明白,可以看看下图:

首先调用Subject.login(token)进行登录,其会自动委托给SecurityManager,调用之前必须通过SecurityUtils.setSecurityManager()设置

2.SecurityManager负责真正的身份验证逻辑,它会委托给Authenticator进行身份验证

3.Authenticator才是真正的身份验证者,shiro API中核心的身份认证入口点,此处可以自定义插入自己的实现

4.Authenticator可能会委托给相应的AuthenticationStrategy进行多Realm身份验证,默认ModularRealmAuthenticator会调用AuthenticationStrategy进行多Realm身份验证。

5.Authenticator会把相应的token传入Realm,从Realm获取身份验证信息,如果没有返回/抛出异常表示身份验证失败了。此外可以配置多个Realm,将按照相应的顺序及策略进行访问。

随着社会的发展,现在前端展示的方式多样,由原本网页单一形式,到现在的网页、小程序、Android、IOS等多元化模式。由于前端展示的多元化,原有采用session有状态的认证方式已经无法满足需求,所以需要调整后台的技术框架,让系统能满足有状态认证和无状态token认证并存。

后台的管理系统是采用码云上开源的renren-security系统,该系统采用的认证框架是Shiro。考虑系统采用原本的权限控制采用Session方式,整体风险大且时间周期长,所以整合考虑采用SessionId作为token的方式,进行无状态的token认证方式。

登录时,POST用户名与密码到/login进行登入,如果成功返回一个会话ID,以会话ID作为token,失败的话直接返回401错误。之后用户访问每一个需要权限的网址请求必须在header中添加Authorization字段,例如Authorization: token,token为密钥。后台会进行token的校验,如果有误会直接返回401。

在login方法验证通过后,以SessionId作为token,通过json返回客户端。

重写Sessionmanager的getSessionId方法,获取token作为SessionId,同时修改request的“REFERENCED_SESSION_ID”为token,因为token为验证通过的sessionId,所以此request也会采用验证通过的Session进行获取验证和权限。

新建一个Maven工程,添加相关的依赖。

编写认证方法和授权方法。

重写继承DefaultWebSessionManager的SessionManager,修改getSessionId方法,通过获取的token作为SessionId。

配置Realm和SessionManager,还有关于路径的拦截等配置。

整体配置可以参考: https://blog.csdn.net/qq_34996727/article/details/81133729

SessionManager可以参考: https://blog.csdn.net/u011456867/article/details/80484559


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11537098.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-16
下一篇 2023-05-16

发表评论

登录后才能评论

评论列表(0条)

保存