美文网首页
SpringBoot快速实现鉴权系统,基于LoopAuth

SpringBoot快速实现鉴权系统,基于LoopAuth

作者: Sober_清醒 | 来源:发表于2022-08-27 14:11 被阅读0次

    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的位置,同时登录成功或登录续期操作也会主动返回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 "检测成功";
    }   
    

    更多功能请查看官方文档

    相关文章

      网友评论

          本文标题:SpringBoot快速实现鉴权系统,基于LoopAuth

          本文链接:https://www.haomeiwen.com/subject/wgjfnrtx.html