LoopAuth一款低侵入、精簡、輕量、細(xì)粒度的Java Web權(quán)限管理框架
目前包含如下功能:
- 注解鑒權(quán)
- 代碼鑒權(quán)
- 登錄功能
- 有/無狀態(tài)登錄
- Redis登錄業(yè)務(wù)存儲(chǔ)分離
后續(xù)拓展計(jì)劃(按照開發(fā)順序排列):
- ABAC權(quán)限拓展
- 微服務(wù)支持
- 賬戶風(fēng)險(xiǎn)監(jiān)控
官方地址:
上手試試
添加依賴
<!-- LoopAuth的Springboot插件 -->
<dependency>
<groupId>com.sobercoding</groupId>
<artifactId>LoopAuth-spring-boot-starter</artifactId>
<version>1.0.2</version>
</dependency>
配置文件
快速體驗(yàn)可以無需配置
yml文件,完成其他配置直接啟動(dòng)即可
- 登錄規(guī)則及持久層的配置需要開啟
token-persistence配置項(xiàng) -
access-modes為從請求獲取token的位置,同時(shí)登錄成功或登錄續(xù)期操作也會(huì)主動(dòng)返回token到HEADER或COOKIE中
loop-auth:
time-out: 5 # token有效時(shí)間(單位秒) 默認(rèn)24小時(shí)
token-persistence: true # token持久化配置 默認(rèn)false
token-name: token # token名稱 同時(shí)也作為 默認(rèn)LoopAuth
mutualism: true # token共生 默認(rèn)false 開啟則 賬號(hào)可以同時(shí)在線
exclusion: true # 互斥登錄, 默認(rèn)false 開啟則 多人操作相同設(shè)備登錄 會(huì)互相擠掉線(只有在 mutualism=true 時(shí)此配置才有效)
max-login-count: 3 # 同一賬號(hào)最大登錄數(shù)量 默認(rèn)1 -1代表不限制
renew: false # 自動(dòng)續(xù)簽 默認(rèn)true 每次isLogin操作,會(huì)自動(dòng)刷新token有效期
access-modes: # token獲取方式 默認(rèn)[COOKIE,HEADER]順序獲取。即COOKIE中獲取到鑒權(quán)成功,則不前往HEADER獲取
- HEADER
- COOKIE
secret-key: secret # 默認(rèn)LoopAuth Token生成密鑰
token-persistence-prefix: tokenPrefix # 默認(rèn)LoopAuthToken token持久層存儲(chǔ)的前綴
login-id-persistence-prefix: loginIdPrefix # 默認(rèn)LoopAuthLoginId LoginId持久層存儲(chǔ)的前綴
cookie-config: # cookie配置
remember: true # 是否長久有效 默認(rèn)false 開啟則cookie的有效時(shí)間為time-out,關(guān)閉則網(wǎng)頁關(guān)閉后cookie丟失
domain: localhost # 域 默認(rèn)服務(wù)端域
path: /test # 默認(rèn)'/' 路徑
http-only: true # 默認(rèn)false 是否允許js操作
secure: true # 默認(rèn)false 是否只在https安全協(xié)議傳輸
# 安全等級(jí) Strict (完全禁止第三方Cookie,跨站點(diǎn)時(shí),任何情況下都不會(huì)發(fā)送Cookie)
# Lax 不發(fā)送第三方 Cookie,但是導(dǎo)航到目標(biāo)網(wǎng)址的 Get 請求除外
# None 不限制 默認(rèn)參數(shù)
same-site: Strict
簡單使用
- 新建
Controller類
@RestController
public class DemoController {
@GetMapping("/login")
public String register(){
// 登錄方法
LoopAuthFaceImpl.login("1");
return "登錄成功";
}
@GetMapping("/islogin")
public String isLogin(){
// 驗(yàn)證是否登錄
LoopAuthFaceImpl.isLogin();
return "已經(jīng)登錄";
}
@GetMapping("/out")
public String loginOut(){
// 驗(yàn)證是否登錄
LoopAuthFaceImpl.isLogin();
// 注銷登錄
LoopAuthFaceImpl.logout();
return "注銷成功";
}
}
鑒權(quán)Or登錄驗(yàn)證
實(shí)現(xiàn)PermissionInterface接口
- 要實(shí)現(xiàn)角色/權(quán)限代碼的鑒權(quán),就需要獲取當(dāng)前登錄賬戶的角色列表、權(quán)限代碼列表
- 需要手動(dòng)實(shí)現(xiàn)
PermissionInterface接口并注入
public class PermissionInterfaceImpl implements PermissionInterface {
@Override
public Set<String> getPermissionSet(String userId, String loginType) {
// 這里只做演示 所以寫死 根據(jù)業(yè)務(wù)查詢數(shù)據(jù)庫或者其他操作
return new HashSet<String>() {
{
add("user-*");
}
};
}
@Override
public Set<String> getRoleSet(String userId, String loginType) {
// 這里只做演示 所以寫死 根據(jù)業(yè)務(wù)查詢數(shù)據(jù)庫或者其他操作
return new HashSet<String>() {
{
add("user");
}
};
}
}
自動(dòng)注入
- 在
PermissionInterface的實(shí)現(xiàn)類上加上@Component注解即可
@Component
public class PermissionInterfaceImpl implements PermissionInterface {
...
}
手動(dòng)注入
- 保證項(xiàng)目啟動(dòng)時(shí)執(zhí)行下面語句即可
LoopAuthStrategy.setPermissionInterface(new PermissionInterfaceImpl());
LoopAuthVerifyMode
-
LoopAuthVerifyMode是一個(gè)枚舉類,里面包含了OR、AND、NON -
OR代表或 -
AND代表與 -
NON代表非 - 所有需要填寫
LoopAuthVerifyMode的方法,不填寫則默認(rèn)AND
代碼鑒權(quán)
- 所有需要登錄的方法都會(huì)內(nèi)部默認(rèn)先調(diào)用一次
LoopAuthFaceImpl.isLogin();,即checkByRole等方法使用時(shí)你無需手動(dòng)調(diào)用isLogin
// 判斷是否登錄
LoopAuthFaceImpl.isLogin();
// 判斷用戶是否擁有user角色
LoopAuthFaceImpl.checkByRole("user")
// 判斷用戶是否擁有user-**或者order-get中權(quán)限代碼
LoopAuthFaceImpl.checkByPermission(LoopAuthVerifyMode.OR, "user-**","order-get")
注解鑒權(quán)
- 所有需要登錄的方法都會(huì)默認(rèn)執(zhí)行
@LoopAutoCheckLogin,即@LoopAuthPermission上無需使用@LoopAutoCheckLogin - 注解可以加在類上來避免重復(fù)工作
- 注解鑒權(quán)需要依賴攔截器
注入攔截器
@Component
public class LoopAuthMvcConfigure implements WebMvcConfigurer {
/**
* 注冊LoopAuth 的攔截器,打開注解式鑒權(quán)功能
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
// 注冊注解攔截器
registry.addInterceptor(new LoopAuthAnnotationInterceptor()).addPathPatterns("/**");
}
}
用注解攔截
// 驗(yàn)證登錄
@LoopAutoCheckLogin
// 判斷用戶是否擁有user-**或者order-get中權(quán)限代碼
@LoopAuthPermission(value= {"user-**","order-get"},mode = LoopAuthVerifyMode.OR)
@GetMapping("/testPermission")
public String testPermission(){
return "檢測成功";
}
// 驗(yàn)證登錄
@LoopAutoCheckLogin
// 判斷用戶是否擁有user角色
@LoopAuthRole(value="user")
@GetMapping("/testRole")
public String testRole(){
return "檢測成功";
}