SpringBoot快速实现鉴权系统,基于LoopAuth
2022-08-27 本文已影响0人
Sober_清醒
LoopAuth一款低侵入、精简、轻量、细粒度的Java Web权限管理框架
目前包含如下功能:
- 注解鉴权
- 代码鉴权
- 登录功能
- 有/无状态登录
- Redis登录业务存储分离
后续拓展计划(按照开发顺序排列):
- ABAC权限拓展
- 微服务支持
- 账户风险监控
官方地址:
上手试试
添加依赖
<!-- LoopAuth的Springboot插件 -->
<dependency>
<groupId>com.sobercoding</groupId>
<artifactId>LoopAuth-spring-boot-starter</artifactId>
<version>1.0.2</version>
</dependency>
配置文件
快速体验可以无需配置
yml
文件,完成其他配置直接启动即可
- 登录规则及持久层的配置需要开启
token-persistence
配置项 -
access-modes
为从请求获取token
的位置,同时登录成功或登录续期操作也会主动返回token
到HEADER
或COOKIE
中
loop-auth:
time-out: 5 # token有效时间(单位秒) 默认24小时
token-persistence: true # token持久化配置 默认false
token-name: token # token名称 同时也作为 默认LoopAuth
mutualism: true # token共生 默认false 开启则 账号可以同时在线
exclusion: true # 互斥登录, 默认false 开启则 多人操作相同设备登录 会互相挤掉线(只有在 mutualism=true 时此配置才有效)
max-login-count: 3 # 同一账号最大登录数量 默认1 -1代表不限制
renew: false # 自动续签 默认true 每次isLogin操作,会自动刷新token有效期
access-modes: # token获取方式 默认[COOKIE,HEADER]顺序获取。即COOKIE中获取到鉴权成功,则不前往HEADER获取
- HEADER
- COOKIE
secret-key: secret # 默认LoopAuth Token生成密钥
token-persistence-prefix: tokenPrefix # 默认LoopAuthToken token持久层存储的前缀
login-id-persistence-prefix: loginIdPrefix # 默认LoopAuthLoginId LoginId持久层存储的前缀
cookie-config: # cookie配置
remember: true # 是否长久有效 默认false 开启则cookie的有效时间为time-out,关闭则网页关闭后cookie丢失
domain: localhost # 域 默认服务端域
path: /test # 默认'/' 路径
http-only: true # 默认false 是否允许js操作
secure: true # 默认false 是否只在https安全协议传输
# 安全等级 Strict (完全禁止第三方Cookie,跨站点时,任何情况下都不会发送Cookie)
# Lax 不发送第三方 Cookie,但是导航到目标网址的 Get 请求除外
# None 不限制 默认参数
same-site: Strict
简单使用
- 新建
Controller
类
@RestController
public class DemoController {
@GetMapping("/login")
public String register(){
// 登录方法
LoopAuthFaceImpl.login("1");
return "登录成功";
}
@GetMapping("/islogin")
public String isLogin(){
// 验证是否登录
LoopAuthFaceImpl.isLogin();
return "已经登录";
}
@GetMapping("/out")
public String loginOut(){
// 验证是否登录
LoopAuthFaceImpl.isLogin();
// 注销登录
LoopAuthFaceImpl.logout();
return "注销成功";
}
}
鉴权Or登录验证
实现PermissionInterface
接口
- 要实现角色/权限代码的鉴权,就需要获取当前登录账户的角色列表、权限代码列表
- 需要手动实现
PermissionInterface
接口并注入
public class PermissionInterfaceImpl implements PermissionInterface {
@Override
public Set<String> getPermissionSet(String userId, String loginType) {
// 这里只做演示 所以写死 根据业务查询数据库或者其他操作
return new HashSet<String>() {
{
add("user-*");
}
};
}
@Override
public Set<String> getRoleSet(String userId, String loginType) {
// 这里只做演示 所以写死 根据业务查询数据库或者其他操作
return new HashSet<String>() {
{
add("user");
}
};
}
}
自动注入
- 在
PermissionInterface
的实现类上加上@Component
注解即可
@Component
public class PermissionInterfaceImpl implements PermissionInterface {
...
}
手动注入
- 保证项目启动时执行下面语句即可
LoopAuthStrategy.setPermissionInterface(new PermissionInterfaceImpl());
LoopAuthVerifyMode
-
LoopAuthVerifyMode
是一个枚举类,里面包含了OR
、AND
、NON
-
OR
代表或 -
AND
代表与 -
NON
代表非 - 所有需要填写
LoopAuthVerifyMode
的方法,不填写则默认AND
代码鉴权
- 所有需要登录的方法都会内部默认先调用一次
LoopAuthFaceImpl.isLogin();
,即checkByRole
等方法使用时你无需手动调用isLogin
// 判断是否登录
LoopAuthFaceImpl.isLogin();
// 判断用户是否拥有user角色
LoopAuthFaceImpl.checkByRole("user")
// 判断用户是否拥有user-**或者order-get中权限代码
LoopAuthFaceImpl.checkByPermission(LoopAuthVerifyMode.OR, "user-**","order-get")
注解鉴权
- 所有需要登录的方法都会默认执行
@LoopAutoCheckLogin
,即@LoopAuthPermission
上无需使用@LoopAutoCheckLogin
- 注解可以加在类上来避免重复工作
- 注解鉴权需要依赖拦截器
注入拦截器
@Component
public class LoopAuthMvcConfigure implements WebMvcConfigurer {
/**
* 注册LoopAuth 的拦截器,打开注解式鉴权功能
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注册注解拦截器
registry.addInterceptor(new LoopAuthAnnotationInterceptor()).addPathPatterns("/**");
}
}
用注解拦截
// 验证登录
@LoopAutoCheckLogin
// 判断用户是否拥有user-**或者order-get中权限代码
@LoopAuthPermission(value= {"user-**","order-get"},mode = LoopAuthVerifyMode.OR)
@GetMapping("/testPermission")
public String testPermission(){
return "检测成功";
}
// 验证登录
@LoopAutoCheckLogin
// 判断用户是否拥有user角色
@LoopAuthRole(value="user")
@GetMapping("/testRole")
public String testRole(){
return "检测成功";
}