satoken

简介:Sa-Token 是一个轻量级 Java 权限认证框架,主要解决:登录认证权限认证单点登录OAuth2.0分布式Session会话微服务网关鉴权 等一系列权限相关问题。

SpringBoot集成sa-token

添加依赖:

<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>1.39.0</version>
</dependency>

注:如果你使用的是 SpringBoot 3.x,只需要将 sa-token-spring-boot-starter 修改为 sa-token-spring-boot3-starter 即可。

application.yml配置:

sa-token: 
    # token 名称(同时也是 cookie 名称)
    token-name: satoken
    # token 有效期(单位:秒) 默认30天,-1 代表永久有效
    timeout: 2592000
    # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
    active-timeout: -1
    # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
    is-concurrent: true
    # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
    is-share: true
    # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
    token-style: uuid
    # 是否输出操作日志 
    is-log: true

创建DemoControler.java

@RestController
@RequestMapping("/user")
public class UserController {

	@RequestMapping("doLogin")
	public String doLogin(String username, String password) {
		// 此处仅作模拟示例,真实项目需要从数据库中查询数据进行比对
		if ("zhang".equals(username) && "123456".equals(password)) {
			StpUtil.login(10001);  // 用户Id

			// 登录成功返回前端token信息
			SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
			System.out.println("token名称:" + tokenInfo.getTokenName());
			System.out.println("token值:" + tokenInfo.getTokenValue());
			return "登录成功";
		}
		return "登录失败";
	}

	@RequestMapping("isLogin")
	public String isLogin() {
		return "当前会话是否登录:" + StpUtil.isLogin();
	}
	// 测试添加权限
	@SaCheckPermission("user:add")
	@RequestMapping("add")
	public String add(){
		return "用户添加";
	}

    // 测试删除权限
	@SaCheckPermission("user:delete")
	@RequestMapping("delete")
	public String delete(){
		System.out.println("用户删除");
		return "用户删除";
	}
}

测试:

登录:

http://127.0.0.1:8080/user/doLogin?username=zhang&password=123456

验证登录:

http://127.0.0.1:8080/user/isLogin

验证用户添加和删除的权限,需要增加拦截器配置:

注意:如果没有下面的配置,权限不起作用

SptInterfaceImpl.java

// 实现角色权限认证
@Component
public class SptInterfaceImpl implements StpInterface {

    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        List<String> list = new ArrayList<String>();    
        list.add("user:add");
        list.add("user:update");
        list.add("user:get");
        // list.add("user:delete");
        list.add("art.*");
        return list;
    }

    // 该账号拥有的角色标识集合
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        List<String> list = new ArrayList<String>();    
        list.add("admin");
        list.add("super-admin");
        return list;
    }

}

SatokenConfig.java

@Configuration
public class SatokenConfig implements WebMvcConfigurer{
    
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
    }
}

验证接口权限:

http://127.0.0.1:8080/user/add

添加接口可以访问

http://127.0.0.1:8080/user/delete

删除接口没有权限,因为// list.add("user:delete");注释了,放开再次测试,有接口访问权限。