Light Security

Light Security是一款基于 jwt 的、简洁而不简单的权限控制框架,可与 Spring Boot 配合使用,支持 Spring MVCWebFlux

地址

特点

优点

缺点

依赖

快速上手

Spring Web编程模型

TIPS

快速上手可详见项目 light-security-example 目录,内附详细测试步骤。

基于配置文件的权限配置

基于代码的权限配置

@Configuration
public class LightSecurityConfigurtion {
    @Bean
    public SpecRegistry specRegistry() {
        return new SpecRegistry()
                .add(HttpMethod.GET, "/user", "hasAnyRoles('user')")
                .add(HttpMethod.ANY, "/**", "hasLogin()");
    }
}

此时,application.yml 中的如下配置可删除,因为代码配置方式优先级更高,配置文件方式将会失效

light-security:
  # 权限规则配置:表示用{http-method}方法请求的{path}路径必须具备什么{expression}
  spec-list:
    - http-method: ANY
      path: /login
      expression: "anon()"
    - http-method: ANY
      path: /user
      expression: "hasAnyRoles('user','admin')"
    - http-method: ANY
      path: /user-no-access
      expression: "hasAllRoles('user','admin','xx')"
    - http-method: GET
      path: /error
      expression: "anon()"
    - http-method: ANY
      path: /**
      expression: "hasLogin()"

扩展点

作用
com.itmuch.lightsecurity.jwt.UserOperator 提供用户相关操作,例如解析token获得用户信息等。
com.itmuch.lightsecurity.el.PreAuthorizeExpressionRoot 提供表达式支持,例如hasAnyRoles('user') 等,如需新能力,只需编写新方法即可
com.itmuch.lightsecurity.annotation.support.PreAuthorizeAspect 为注解 @PreAuthorize("hasAllRoles('user','admin')")提供支持

WebFlux编程模型

TIPS

快速上手可详见项目 light-security-webflux-example 目录,内附详细测试步骤。

基于配置文件的权限配置

基于代码的权限配置

@Configuration
public class LightSecurityConfigurtion {
    @Bean
    public SpecRegistry specRegistry() {
        return new SpecRegistry()
                .add(HttpMethod.GET, "/user", "hasAnyRoles('user')")
                .add(HttpMethod.ANY, "/**", "hasLogin()");
    }
}

此时,application.yml 中的如下配置可删除,因为代码配置方式优先级更高,配置文件方式将会失效

light-security:
  # 权限规则配置:表示用{http-method}方法请求的{path}路径必须具备什么{expression}
  spec-list:
    - http-method: ANY
      path: /login
      expression: "anon()"
    - http-method: ANY
      path: /user
      expression: "hasAnyRoles('user','admin')"
    - http-method: ANY
      path: /user-no-access
      expression: "hasAllRoles('user','admin','xx')"
    - http-method: GET
      path: /error
      expression: "anon()"
    - http-method: ANY
      path: /**
      expression: "hasLogin()"

扩展点

作用
com.itmuch.lightsecurity.jwt.ReactiveUserOperator 提供用户相关操作,例如解析token获得用户信息等。
com.itmuch.lightsecurity.el.ReactivePreAuthorizeExpressionRoot 提供表达式支持,例如hasAnyRoles('user') 等,如需新能力,只需编写新方法即可
com.itmuch.lightsecurity.annotation.support.ReactivePreAuthorizeAspect 为注解 @PreAuthorize("hasAllRoles('user','admin')")提供支持

常见问题

为什么要造这个轮子?

老是有人问我诸如"微服务安全怎么管理?"、"Spring Security xxxx问题你遇到过吗?"、"能写个Spring Cloud Security的系列教程吗?"、"Shiroxxxx问题你遇到过吗?"

烦不胜烦,初期积极回复;后来消极回复;再后来懒得回复。

分析一下,发现主要原因还是Spring Security、Shiro学习曲线较高,特别是Spring Security。所以就想写个轻量的框架,能够快速解决主要矛盾——足够简单、能实现权限控制。

为什么不考虑身份认证(登录)?

目前市面上大多权限框架都考虑了"身份认证(登录)" + "权限管理" 。然而登录操作在现在这个时代,是一个"五花八门"的操作。例如:

往往还需还同时支持多种登录方式。这挺难去抽象出通用模式,并为典型的登录方式提供支持。

索性不考虑了——把登录问题留给使用者自己。用户可根据业务需求实现登录逻辑,并颁发Token,后面的事情就交给 Light Security ,让它给你搞定。这样相对更加灵活,更重要的是——你也不再需要去学习用框架应该怎么登录。

TODO