SpringBoot快速實(shí)現(xiàn)鑒權(quán)系統(tǒng),基于LoopAuth

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)返回tokenHEADERCOOKIE
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è)枚舉類,里面包含了ORAND、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 "檢測成功";
}   

更多功能請查看官方文檔

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容