权限管理已经不知不觉深刻到了咱们生活的每个角落,例如地铁进站的闸机,高速公路上的过路费,停车场的杠杆等等等等。git
做为一名开发人员,权限二字对咱们的映像更加深入,不管任何系统,都多多少少与权限管理会沾上关系!什么?你的系统和权限不沾边......好吧,你的代码拉取权限总得有吧!若是尚未的话,你登上掘金看到这篇文章并点了一个赞这个过程就须要好屡次权限校验。好了扯远了,咱们回归正题,这里使用一张图来简单展现web系统的权限是什么样子:github
看完以后,是否是感受很简单,不错,权限管理并不难,咱们只须要将校验这一环节进行开发便可,实现方式也有不少种:web
咱们能够将权限校验的整个过程组件化,例如组件名为AuthComponent
,以后再全部须要权限校验的接口对应的方法的开头,调用AuthComponent
的verify
方法进行校验,根据结果作不一样的业务处理!spring
在方案一的基础上咱们稍加改造,例如使用AOP
对须要校验的接口作个切面,在方法执行前咱们使用AuthComponent
校验一下便可,这样咱们的代码就更方便维护了!api
咱们将方案一和方案二结合一下,取一灵活,取二通用,咱们自定义一个名为@Auth
的注解,而且它须要传一个参数,咱们这里直径定义为枚举类Level
,简单结构以下:bash
public enum Level { LOGIN, ADMIN }
复制代码
以后咱们定义一个注解切面,切向携带@Auth
的方法,在方法执行前根据value值的内容,也就是Level
的值去作不一样的权限管理便可。网络
这是最简单的方法,例如优秀的开源shiro
、spring-Security
等均可以知足咱们的需求,惟一的区别是框架的轻重及使用方式!框架
想必不少同窗都在使用第四种方案,也有很多的小伙伴在使用方案三,对于缺点明显的方案一和二,使用的应该不多。ide
若是咱们的服务并不须要那么重的权限管理框架去解决权限问题,又不想不优雅的自定义注解去实现时,咱们该怎么办呢?spring-boot
不妨试试 Defender
defender
是一款全面拥抱spring-boot
的轻量级,高灵活,高可用的权限框架。若是平常中咱们须要更加优雅的对服务增长权限管理,那么defender
正合适!
它能够免除咱们重复编写自定义注解和切面,只须要调用简单的API便可灵活的指定不一样模式的防护网络。
defender
提供小巧灵活的API去制定你想要的权限过滤网络,提供不少种防护模式,咱们能够经过调用简单的api是使用构建不一样模式的校验器,从而迅速完成权限的管理:
@Configuration
@EnableDefender("* org.nico.trap.controller..*.*(..)")
public class DefenderTestConfig {
@Bean
public Defender init(){
return Defender.getInstance()
.registry(Guarder.builder(GuarderType.URI)
.pattern("POST /user/*")
.preventer(caller -> {
return caller.getRequest().getHeader("token") == null
? Result.pass() : Result.notpass("error");
}))
.ready();
}
}
复制代码
上述代码的做用是对请求符合POST
类型且URI前缀为/user/
的全部接口作了权限管理。
另外,咱们可使用lambda
简单完成权限校验逻辑,又或者使用匿名类实现复杂校验逻辑:
Guarder.builder(GuarderType.ANNOTATION)
.pattern("org.nico.trap.controller")
.preventer(new AbstractPreventer() {
@Autowired
private AuthComponent authComponent;
@Override
public Result detection(Caller caller) {
String identity = caller.getAccess().value();
if(! identity.equals(AuthConst.VISITOR)) {
UserBo user = authComponent.getUser();
if(user != null) {
if(identity.equals(AuthConst.ADMIN)){
if(user.getRuleType() == null) {
return Result.notpass(new ResponseVo<>(ResponseCode.ERROR_ON_USER_IDENTITY_MISMATCH));
}
}
}else {
return Result.notpass(new ResponseVo<>(ResponseCode.ERROR_ON_LOGIN_INVALID));
}
}
return Result.pass();
}
})
复制代码
其中GuarderType.URI
和GuarderType.ANNOTATION
分别表明URI ANT匹配模式和注解模式,后者是方案三的实现,defender
提供简单优雅的api将各类模式的权限校验方式集合在一块儿。
相比shiro
、spring-security
,defender
显得更加轻便灵活,由于它并无提供一系列权限更具体的管理实现,而是将校验的实现开放一个接口面向开发者,整体代码大小不超过21k
,显然对于轻量级的权限管理,defender
更加适合!
defender
刚刚起步,若是你们有兴趣能够将之集成在您的开发环境尝一下鲜,项目地址以下
官方也提供有简单的使用文档
若是您感受不错,也想参与贡献