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

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 "检测成功";
}   

更多功能请查看官方文档

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,367评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,959评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,750评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,226评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,252评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,975评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,592评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,497评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,027评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,147评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,274评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,953评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,623评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,143评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,260评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,607评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,271评论 2 358

推荐阅读更多精彩内容