何为权限管理

权限管理已经不知不觉深入到了我们生活的每一个角落,例如地铁进站的闸机,高速公路上的过路费,停车场的杠杆等等等等。

作为一名开发人员,权限二字对我们的映像更加深刻,无论任何系统,都多多少少与权限管理会沾上关系!什么?你的系统和权限不沾边......好吧,你的代码拉取权限总得有吧!如果还没有的话,你登上掘金看到这篇文章并点了一个赞这个过程就需要好多次权限校验。好了扯远了,我们回归正题,这里使用一张图来简单展示web系统的权限是什么样子:

看完之后,是不是感觉很简单,不错,权限管理并不难,我们只需要将校验这一环节进行开发即可,实现方式也有很多种:

方案一:组件封装

我们可以将权限校验的整个过程组件化,例如组件名为AuthComponent,之后再所有需要权限校验的接口对应的方法的开头,调用AuthComponentverify方法进行校验,根据结果做不同的业务处理!

  • 优点:貌似能达到主要目的,而且非常灵活~
  • 缺点:代码冗余,低内聚,高耦合,不易于维护。

方案二:通用处理

在方案一的基础上我们稍加改造,例如使用AOP对需要校验的接口做个切面,在方法执行前我们使用AuthComponent校验一下即可,这样我们的代码就更方便维护了!

  • 优点:弥补了方案一的缺点。
  • 缺点:太过通用化,很难兼容所有的情况,不灵活。

方案三:自定义注解

我们将方案一和方案二结合一下,取一灵活,取二通用,我们自定义一个名为@Auth的注解,并且它需要传一个参数,我们这里直径定义为枚举类Level,简单结构如下:

public enum Level { LOGIN, ADMIN }
复制代码

之后我们定义一个注解切面,切向携带@Auth的方法,在方法执行前根据value值的内容,也就是Level的值去做不同的权限管理即可。

  • 优点:灵活可控,通用性还行。
  • 缺点:缺乏组件化,结构零散,不易复用,对于多种场景下需要制定多个切面,不优雅!

方案四:使用框架

这是最简单的方法,例如优秀的开源shirospring-Security等都可以满足我们的需求,唯一的区别是框架的轻重及使用方式!

如何更优雅的管理权限

想必很多同学都在使用第四种方案,也有不少的小伙伴在使用方案三,对于缺点明显的方案一和二,使用的应该很少。

如果我们的服务并不需要那么重的权限管理框架去解决权限问题,又不想不优雅的自定义注解去实现时,我们该怎么办呢?

不妨试试 Defender

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.URIGuarderType.ANNOTATION分别代表URI ANT匹配模式和注解模式,后者是方案三的实现,defender提供简单优雅的api将各种模式的权限校验方式集合在一起。

相比shirospring-securitydefender显得更加轻便灵活,因为它并没有提供一系列权限更具体的管理实现,而是将校验的实现开放一个接口面向开发者,总体代码大小不超过21k,显然对于轻量级的权限管理,defender更加适合!

各种传送门

defender刚刚起步,如果大家有兴趣可以将之集成在您的开发环境尝一下鲜,项目地址如下

Defender传送门

官方也提供有简单的使用文档

中文文档

English Document

如果您感觉不错,也想参与贡献

如何贡献

作者:i_am_nico
链接:https://juejin.im/post/5c0f8b606fb9a049fe34fee5

如何使用Defender优雅的管理权限?的更多相关文章

  1. 「SpringBoot」如何优雅地管理SpringBoot项目

    本文主要讲述一下如何优雅地管理SpringBoot项目. 背景 课堂上,当小明形如流水地回答完沐芳老师提出来的问题时,却被至今没有对象的胖虎无情嘲讽了? 沐芳老师:小明,你平时是如何启动.停止你的Sp ...

  2. 【swift学习笔记】五.使用枚举优雅的管理Segue

    在做页面转跳的时候,我们要给Segue命名,如果Segue多了,管理他们就是一个恶梦.我们可以枚举更优雅的管理这些Segue. 1.我们先来建立一个protocol,他的功能就是让实现类实现一个Seg ...

  3. Ecshop:后台添加新功能栏目以及管理权限设置

    一.添加菜单项 打开 /admin/includes/inc_menu.php文件(后台框架左边菜单),在最后添加一行如下: $modules['17_other_menu']['sns_list'] ...

  4. oracle索引、 管理权限和角色

    索引 1 单列索引create index 索引名 on 表名(列名): 2复合索引在同一张表上可以有多个索引,但是要求列的组合必须不同.create index 索引名 on 表名(列名1, 列名2 ...

  5. linux 管理权限

    linux 管理权限 linux 文件 权限 1.使用 ls -l 命令 执行结果如下(/var/log) : drwxr-x--- 2 root adm 4096 2013-08-07 11:03 ...

  6. oracle管理权限和角色

    介绍 这一部分主要看看oracle中如何管理权限和角色,权限和角色的区别在哪里. 当刚刚建立用户时,用户没有任何权限,也不能执行任何操作.如果要执行某种特定的数据库操作,则必需为其授予系统的权限:如果 ...

  7. Token令牌管理权限

    什么是token HTTP是一种无状态的协议,也就是HTTP没法保存客户端的信息,没办法区分每次请求的不同. Token是服务器生成的一串字符,作为客户端请求的令牌.当第一次登陆后,服务器会分发Ton ...

  8. 通过Weeman+Ettercap配合拿下路由器管理权限

    通过Weeman+Ettercap配合拿下路由器管理权限 本文转自>>>i春秋学院 本篇文章主要介绍如何在接入无线网络后如何拿到路由器的管理权限,至于如何得到路由器连接密码可以参考 ...

  9. Confluence 6 管理和恢复空间管理权限

    管理和恢复空间管理权限 可能有些空间的空间管理权限被系统的超级管理删除掉了.这样的空间是没有任何空间管理员的,用户和用户组都不能对空间进行管理.只有 Confluence 管理员权限的用户可以删除一个 ...

随机推荐

  1. nginx负载均衡和tomcat热部署简单了解

    简单说下几个名词 nginx     它是一个反向代理,实际上就是一台负责转发的代理服务器,貌似充当了真正服务器的功能,但实际上并不是,代理服务器只是充当了转发的作用,并且从真正的服务器那里取得返回的 ...

  2. js中的php rand函数

    //文件rand.js function MyRand(min, max){ this.min = min; this.max = max; } MyRand.prototype.getRand = ...

  3. mysql my.cnf 或my.ini配置文件参数解释(转):

    #*** client options 相关选项 ***# #以下选项会被MySQL客户端应用读取.注意只有MySQL附带的客户端应用程序保证可以读取这段内容.如果你想你自己的MySQL应用程序获取这 ...

  4. Intellij IDEA Scala开发环境搭建

    1,在intellij 官网上下载IDEA 2,在scala官网上下载最新版scala 3,安装两个下载的文件 4,打开intellij,菜单栏help->find action   输入plu ...

  5. JavaScript的setTimeout()和setInterval()

    1. setTimeout()方法 作用:在制定的毫秒数后调用函数或计算表达式 语法: setTimeout(code,millisec) 实例: function timedMsg() { var ...

  6. Codechef_JULY14

    感觉这套比赛题目比较容易,没有以前做过的某次codechef那么凶残.题目还是很有意思的,最好的是有中文翻译. CSUB:签到题,直接从左往右扫一遍即可,维护前面出现过多少个1. #include & ...

  7. Java 输入/输出 反射

    Java  输入/输出   反射 输入输出和反射 一.数据流的基本概念 流一般分为 ( Input Stream ) 和输出流 ( Output Stream ) 两类,但这种划分并不是绝对的.比如一 ...

  8. 遇到问题----linux-----linux 打开文件数 too many open files 解决方法

    在运行某些命令或者 tomcat等服务器持续运行 一段时间后可能遇到   too many open files. 出现这句提示的原因是程序打开的文件/socket连接数量超过系统设定值. 查看每个用 ...

  9. bug -- android 7.0 popwindow显示位置异常情况解决

    android 7.0 popwindow显示位置异常,在android7.1官方进行解决了,但是还是要多7.0的bug进行解决,我的解决方案里面通过重写popwindow进行适配: import a ...

  10. tar 命令显示进度条

    实现该功能需要安装 pv,然后把需要处理的数据通过管道传给 pv,最后再进行操作. 传给 pv 的目的是为了知道已经处理的数据量大小,同时需要通过 -s 指定总共需要处理的数据量大小. pv 的安装一 ...