shiro认证流程
- QuickStartTest.java
package com.lzh;
/**
* @Author:kaiyang.cui
* @Package:com.lzh
* @Project:lzh_shiro
* @name:QuickStartTest
* @Date:2023/3/27 下午2:05
* @Filename:QuickStartTest
* @Description:填写功能描述
* @Version:1.0
*/
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.After;
import org.junit.Before;
import org.junit.Test;
/**
* 单元测试用例执行顺序
* @BeforeClass -> @Before -> @Test -> @After -> @AfterClass
*/
public class QuickStartTest {
private SimpleAccountRealm accountRealm = new SimpleAccountRealm();
private DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
@Before
public void init(){
// 初始化数据源
accountRealm.addAccount("lll","123");
accountRealm.addAccount("lzh","123");
// 构建环境
defaultSecurityManager.setRealm(accountRealm);
}
@Test
public void testAuthentication(){
// 设置环境上下文
SecurityUtils.setSecurityManager(defaultSecurityManager);
// 获取操作主体
Subject subject = SecurityUtils.getSubject();
// 模拟用户输入的用户名和密码
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("lll", "123");
subject.login(usernamePasswordToken);
// 获取验证结果 isAuthenticated() 是否授权,结果是boolen
System.out.println("认证结果"+subject.isAuthenticated());
}
}
认证结果true
梳理shiro认证和授权流程以及常用api
授权是基于用户登录(认证)之后做的事情,比如:
普通用户购买和查看商品权限。
管理员拥有修改、上架商品的权限。
//是否有对应的角色
subject.hasRole("root")
//获取subject名
subject.getPrincipal()
//检查是否有对应的角色,无返回值,直接在SecurityManager里面进行判断
subject.checkRole("admin")
//检查是否有对应的角色,有返回值,为boolen
subject.hasRole("admin")
//退出登录
subject.logout();
实战-使用shiro模拟用户登录与退出
package com.lzh;
/**
* @Author:kaiyang.cui
* @Package:com.lzh
* @Project:lzh_shiro
* @name:QuickStartTest
* @Date:2023/3/27 下午2:05
* @Filename:QuickStartTest
* @Description:填写功能描述
* @Version:1.0
*/
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;
/**
* 单元测试用例执行顺序
* @BeforeClass -> @Before -> @Test -> @After -> @AfterClass
*/
public class QuickStartTest2 {
private SimpleAccountRealm accountRealm = new SimpleAccountRealm();
private DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager();
@Before
public void init(){
// 初始化数据源
// addAccount第三个参数是设置用户权限,root、admin、user
accountRealm.addAccount("lll","123","root","admin");
accountRealm.addAccount("lzh","123","user");
// 构建环境
defaultSecurityManager.setRealm(accountRealm);
}
@Test
public void testAuthentication(){
// 设置环境上下文
SecurityUtils.setSecurityManager(defaultSecurityManager);
// 获取操作主体
Subject subject = SecurityUtils.getSubject();
// 模拟用户输入的用户名和密码
UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("lll", "123");
subject.login(usernamePasswordToken);
// 获取验证结果 isAuthenticated() 是否授权,结果是boolen
System.out.println("认证结果:"+subject.isAuthenticated());
// 是否有对应的角色
System.out.println("是否有对应的角色:"+subject.hasRole("root"));
System.out.println("getPrincipal认证结果"+subject.getPrincipal());
// 退出登录
subject.logout();
// 检查用户退出登录后的认证结果
System.out.println("认证结果:"+subject.isAuthenticated());
}
}
认证结果:true
是否有对应的角色:true
getPrincipal认证结果lll
认证结果:false