最近看了好几个认证框架,什么 Appache Shiro 啦、Sa-Token 啦、Spring Security啦。。。尤其是Spring Security,做为对标 Spring Boot & Cloud 的框架 Solon 怎么的也要有自己的亲生安全认证框架。所以在适配了 Sa-Token(satoken-solon-plugin) 和 sureness(sureness-solon-plugin) 之后,也开发了Solon 的亲儿子:Solon Auth (solon.extend.auth)。设计目标是更加简单些、更直接些,同时为用户提供更丰富而不同的认证框架选择。

Solon Auth (solon.extend.auth)

Solon Auth 的定位是,只做认证控制。侧重对验证结果的适配,及在此基础上的统一控制和应用。功能会少,但适配起来不会晕。

Solon Auth 支持规则控制和注解控制两种方案,各有优缺点,也可组合使用:

  • 规则控制,适合在一个地方进行整体的宏观控制
  • 注解控制,方便在细节处精准把握

一、开始适配,完成2步动作即可

  • 第1步,构建一个认证适配器
@Configuration
public class Config {
@Bean
public AuthAdapter init() {
//
// 构建适配器
//
return new AuthAdapter()
.loginUrl("/login") //设定登录地址,未登录时自动跳转(如果不设定,则输出401错误)
.addRule(r -> r.include("**").verifyIp().failure((c, t) -> c.output("你的IP不在白名单"))) //添加规则
.addRule(b -> b.exclude("/login**").exclude("/run/**").verifyPath()) //添加规则
.processor(new AuthProcessorImpl()) //设定认证处理器
.failure((ctx, rst) -> { //设定默认的验证失败处理
ctx.render(rst);
});
}
} //规则配置说明
//1.include(path) 规则包函的路径范围,可多个
//2.exclude(path) 规则排序的路径池围,可多个
//3.failure(..) 规则失则后的处理
//4.verifyIp()... 规则要做的验证方案(可多个不同的验证方案)
  • 第2步,实现一个认证处理器

先了解一下 AuthProcessor 的接口,它对接的是一系列的验证动作结果。可能用户得自己也得多干点活,但很直观。

//认证处理器
public class AuthProcessorImpl implements AuthProcessor { @Override
public boolean verifyIp(String ip) {
//验证IP,是否有权访问
} @Override
public boolean verifyLogined() {
//验证登录状态,用户是否已登录
} @Override
public boolean verifyPath(String path, String method) {
//验证路径,用户可访问
} @Override
public boolean verifyPermissions(String[] permissions, Logical logical) {
//验证特定权限,用户是权有限
} @Override
public boolean verifyRoles(String[] roles, Logical logical) {
//验证特定角色,用户是否角色
}
}

现在做一次适配实战,用的是一份生产环境的代码:

public class AuthProcessorImpl implements AuthProcessor {
private int puid() {
return Context.current().session("puid", 0);
} @Override
public boolean verifyIp(String ip) {
return true; //ip不限制,直接返回true
} @Override
public boolean verifyLogined() {
return puid() > 0; //用户id大于0,说明已登录
} @Override
public boolean verifyPath(String path, String method) {
try {
if (BcfClient.hasUrlpath(path)) {
return BcfClient.hasUrlpathByUser(puid(), path);
} else {
return true;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} @Override
public boolean verifyPermissions(String[] permissions, Logical logical) {
int puid = puid(); try {
if (logical == Logical.AND) {
boolean isOk = true; for (String p : permissions) {
isOk = isOk && BcfClient.hasResourceByUser(puid, p);
} return isOk;
} else {
for (String p : permissions) {
if (BcfClient.hasResourceByUser(puid, p)) {
return true;
}
}
return false;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
} @Override
public boolean verifyRoles(String[] roles, Logical logical) {
int puid = puid(); try {
if (logical == Logical.AND) {
boolean isOk = true; for (String p : roles) {
isOk = isOk && BcfClient.isUserInGroup(puid, p);
} return isOk;
} else {
for (String p : roles) {
if (BcfClient.isUserInGroup(puid, p)) {
return true;
}
}
return false;
}
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

二、2种应用方式(一般组合使用)

刚才我们算是适配好了,现在就应用的活了。

  • 第1种,在 AuthAdapter 直接配置所有规则,或部分规则(也可以不配)
//参考上面的适配器 addRule(...)

配置的好处是,不需要侵入业务代码;同时在统一的地方,宏观可见;但容易忽略掉细节。

  • 第2种,基于注解做一部份(一般特定权限 或 特定角色时用)
@Mapping("/rock/agroup")
@Controller
public class AgroupController {
@Mapping("")
public void home() {
//agroup 首页
} @Mapping("inner")
public void inner() {
//内部列表页
} @AuthPermissions("agroup:edit") //需要特定权限
@Mapping("edit/{id}")
public void edit(int id) {
//编辑显示页,需要编辑权限
} @AuthRoles("admin") //需要特定角色
@Mapping("edit/{id}/ajax/save")
public void save(int id) {
//编辑处理接口,需要管理员权限
}
}

注解的好处是,微观可见,在一个方法上就可以看到它需要什么权限或角色,不容易忽略。

  • 组合使用方式

一般,用配置规则,控制所有需要登录的地址;用注解,控制特定的权限或角色。

三、本案源码

https://gitee.com/noear/solon_demo/tree/master/demo16.solon_auth

四、其它生产项目应用

https://gitee.com/noear/water/tree/master/wateradmin

https://gitee.com/noear/sponge/tree/main/spongeadmin

附:Solon 项目地址

附:Solon 其它入门示例

Solon Auth 认证框架使用演示(更简单的认证框架)的更多相关文章

  1. Python+Selenium框架设计篇之-什么是自动化测试框架

    1.什么是自动化测试框架 简单来说,自动化测试框架就是由一些标准,协议,规则组成,提供脚本运行的环境.自动化测试框架能够提供很多便利给用户高效完成一些事情,例如,结构清晰开发脚本,多种方式.平台执行脚 ...

  2. 《一头扎进》系列之Python+Selenium框架设计篇1-什么是自动化测试框架-价值好几K的框架,不看别后悔,过时不候

    1. 什么是自动化测试框架 在了解什么是自动化测试框架之前,先了解一下什么叫框架?框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法:另一种定义认为,框架是可被应用开发者定制的 ...

  3. android -------- OkGo (让网络请求更简单的框架)

    项目地址:https://github.com/jeasonlzy 该库是封装了okhttp的网络框架,可以与RxJava完美结合,比Retrofit更简单易用.支持大文件上传下载,上传进度回调,下载 ...

  4. EpiiAdmin 开源的php交互性管理后台框架, 让复杂的交互变得更简单!Phper快速搭建交互性平台的开发框架,基于Thinkphp5.1+Adminlte3.0+Require.js。

    EpiiAdmin EpiiAdmin php开源交互性管理后台框架,基于Thinkphp5.1+Adminlte3.0+Require.js, 让复杂的交互变得更简单!Phper快速搭建交互性平台的 ...

  5. thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证)

    thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证)    Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比 ...

  6. leaflet一个前端gis框架,比openlayer更简单

    leaflet一个前端gis框架,比openlayer更简单 作者github:https://github.com/mourner?tab=overview&from=2009-12-01& ...

  7. 更好用 更简单的Java缓存框架 jscache

    比Spring Cache 更好用 更简单的缓存工具 jscache 取名意义为 java simple cache,基于AOP实现,支持注解到接口 自定义单个缓存过期时间配置 ttl,轻松扩展缓存实 ...

  8. web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例

    Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...

  9. vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结

    vue—你必须知道的   目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...

随机推荐

  1. hdu1530 最大团简单题目

    题意:       给你一个无向图,让你找到这个图里面的最大团是多少. 思路:       最大图案是NP问题,直接暴力搜索,如果当前的这个点可以加入当前最大团,那么就选择加入或者舍去,如果不能加入, ...

  2. HTTP协议之分块传输与分段编码

    目录 数据的分块传输 数据的分段编码(transfer-encoding) 前置知识:HTTP协议 数据的分块传输 我们都知道http协议是由TCP协议封装而来的应用层协议.我们和服务器之间的每次ht ...

  3. Linux提权—脏牛漏洞(CVE-2016-5195)

    目录 脏牛漏洞 exp1复现: exp2复现: 脏牛漏洞 脏牛漏洞,又叫Dirty COW,存在Linux内核中已经有长达9年的时间,在2007年发布的Linux内核版本中就已经存在此漏洞.Linux ...

  4. 子域名探测工具Aquatone的使用

    目录 Aquatone Aquatone的安装 Aquatone的使用 子域名爆破 端口扫描

  5. [CTF]摩斯电码

    摩尔斯电码 -----------转载 https://morse.supfree.net/ 摩尔斯电码定义了包括:英文字母A-Z(无大小写区分)十进制数字0-9,以及"?"&qu ...

  6. 如何在jQuery的Ajax调用后管理一个重定向请求

    1 success:function(data){ 2 if(data.xx == "xx") 3 { 4 //code... 5 window.location.href =&q ...

  7. seccomp沙盒逃逸基础——沙盒的规则编写

    seccomp沙盒逃逸基础--沙盒的规则编写 引入: 安全计算模式 seccomp(Secure Computing Mode)是自 Linux 2.6.10 之后引入到 kernel 的特性.一切都 ...

  8. Day003 数据类型

    数据类型 强类型语言 ​ 要求变量的使用要严格符合规定,所有变量都必须先定义后才能使用(java.c++.c#) 弱类型语言 ​ 与强类型语言定义相反(javaScript) Java的数据类型 基本 ...

  9. 【译】.NET 的新的动态检测分析

    随着 Visual Studio 16.9 的发布,Visual Studio 中的检测分析变得更好用了.本文介绍我们新的动态分析工具.这个工具显示了函数被调用的确切次数,并且比我们以前的静态检测工具 ...

  10. 关于有符号数和无符号数的转换 - C/C++

    转载自:http://www.94cto.com/index/Article/content/id/59973.html 1.引例: 今天在做了一道关于有符号数和无符号数相互转换及其左移/右移的问题, ...