最近项目上要改造为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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)