关于java:SpringBoot快速实现鉴权系统基于LoopAuth

31次阅读

共计 3472 个字符,预计需要花费 9 分钟才能阅读完成。

LoopAuth 一款低侵入、精简、轻量、细粒度的 Java Web 权限治理框架

目前蕴含如下性能:

  • 注解鉴权
  • 代码鉴权
  • 登录性能
  • 有 / 无状态登录
  • Redis 登录业务存储拆散

后续拓展打算(依照开发顺序排列):

  • ABAC 权限拓展
  • 微服务反对
  • 账户危险监控

官网地址:

  • Gitee
  • GitHub
  • 官网文档

上手试试

增加依赖

<!-- 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 的地位,同时登录胜利或登录续期操作也会被动返回 tokenHEADERCOOKIE
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是一个枚举类,外面蕴含了ORANDNON
  • 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 "检测胜利";}   

更多功能请查看官网文档

正文完
 0