Springboot2.x整合 Apache Shiro快速上手实战
环境 :Maven + Jdk8 + Springboot 2.X + IDEA (Eclipse也可以)
1创建SpringBoot项目
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.6</version>
</dependency>
<!--整合Shiro相关jar包 主要就学这个-->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.4.0</version>
</dependency>
2、完成shior的步骤
- 1 构建环境
- 2 调用 Subject.login() 执行认证
- 3 SecurityManager 进行认证
- 4 Authenticator执行认证
- 5 根据Realm进行验证
3、新建一个测试类
package com.lx.shior;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.SimpleAccountRealm;
import org.apache.shiro.subject.Subject;
import org.junit.Before;
import org.junit.Test;
public class ShiorTest {
/*步骤
* 1 构建环境
* 2 调用 Subject.login() 执行认证
* 3 SecurityManager 进行认证
* 4 Authenticator执行认证
* 5 根据Realm进行验证
* */
// 定义realm 数据域,Shiro和安全数据的连接器,好比jdbc连接数据库; 通过realm获取认证授权相关信息
private SimpleAccountRealm realm = new SimpleAccountRealm();
//先创建SecurityManger环境,手动添加个Reals到创建SecurityManger环境中
private DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
@Before
public void init() {
//给它加上账号密码模仿从数据库获取到账号密码
realm.addAccount("admin", "123");
realm.addAccount("user1", "456");
defaultSecurityManager.setRealm(realm);
}
@Test
public void contextLoads() {
/*
SecurityUtils是一个抽象的工具类,提供了SecurityManager实例的保存和获取方法,以及创建Subject的方法。
SecurityUtils提供了getSecurityManager()和setSecurityManager方法,还有个特殊的方法getSubject(),这是获取主体的最有效的途径
*/
SecurityUtils.setSecurityManager(defaultSecurityManager);
// Subject 导入shiro的包 import org.apache.shiro.subject.Subject;
//下面是用户的输入账号密码
Subject subject = SecurityUtils.getSubject();
//获取到token
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("admin", "123");
subject.login(usernamePasswordToken);
System.out.println("查看认证结果:" + subject.isAuthenticated());
}
}
4、其他的方法
@Before
public void init() {
// 第1一个参数账号 第2个参数密码 第3个参数超级管理员 第4个参数普通管理员
realm.addAccount("admin", "123","root","admin");
realm.addAccount("user1", "456");
defaultSecurityManager.setRealm(realm);
}
@Test
public void contextLoads() {
/*
SecurityUtils是一个抽象的工具类,提供了SecurityManager实例的保存和获取方法,以及创建Subject的方法。
SecurityUtils提供了getSecurityManager()和setSecurityManager方法,还有个特殊的方法getSubject(),这是获取主体的最有效的途径
*/
SecurityUtils.setSecurityManager(defaultSecurityManager);
// Subject 导入shiro import org.apache.shiro.subject.Subject;
//下面是用户的输入账号密码
Subject subject = SecurityUtils.getSubject();
//获取到token
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("admin", "123");
subject.login(usernamePasswordToken);
System.out.println("查看认证结果:" + subject.isAuthenticated());
//是否有对应的角色
System.out.println("是否有对应的角色:" + subject.hasRole("root"));
//获取subject名
System.out.println("获取用户名:" + subject.getPrincipal());
//检查是否有对应的角色
System.out.println("检查是否有对应的角色:"+ subject.hasRole("admin"));
//检查是否有对应的角色,无返回值,直接在SecurityManager里面进行判断
subject.checkRole("admin");
//退出登录
subject.logout();
}