Solon Auth 认证框架使用演示(更简单的认证框架)
最近看了好几个认证框架,什么 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 入门教程示例:https://gitee.com/noear/solon_demo
- Solon Rpc 入门教程示例:https://gitee.com/noear/solon_rpc_demo
- Solon Cloud 入门教程示例:https://gitee.com/noear/solon_cloud_demo
- Solon 进阶教程示例:https://gitee.com/noear/solon_advance_demo
Solon Auth 认证框架使用演示(更简单的认证框架)的更多相关文章
- Python+Selenium框架设计篇之-什么是自动化测试框架
1.什么是自动化测试框架 简单来说,自动化测试框架就是由一些标准,协议,规则组成,提供脚本运行的环境.自动化测试框架能够提供很多便利给用户高效完成一些事情,例如,结构清晰开发脚本,多种方式.平台执行脚 ...
- 《一头扎进》系列之Python+Selenium框架设计篇1-什么是自动化测试框架-价值好几K的框架,不看别后悔,过时不候
1. 什么是自动化测试框架 在了解什么是自动化测试框架之前,先了解一下什么叫框架?框架是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法:另一种定义认为,框架是可被应用开发者定制的 ...
- android -------- OkGo (让网络请求更简单的框架)
项目地址:https://github.com/jeasonlzy 该库是封装了okhttp的网络框架,可以与RxJava完美结合,比Retrofit更简单易用.支持大文件上传下载,上传进度回调,下载 ...
- EpiiAdmin 开源的php交互性管理后台框架, 让复杂的交互变得更简单!Phper快速搭建交互性平台的开发框架,基于Thinkphp5.1+Adminlte3.0+Require.js。
EpiiAdmin EpiiAdmin php开源交互性管理后台框架,基于Thinkphp5.1+Adminlte3.0+Require.js, 让复杂的交互变得更简单!Phper快速搭建交互性平台的 ...
- thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证)
thinkphp Auth认证类 比RBAC更好的权限认证方式(Auth类认证) Auth 类已经在ThinkPHP代码仓库中存在很久了,但是因为一直没有出过它的教程, 很少人知道它, 它其实比 ...
- leaflet一个前端gis框架,比openlayer更简单
leaflet一个前端gis框架,比openlayer更简单 作者github:https://github.com/mourner?tab=overview&from=2009-12-01& ...
- 更好用 更简单的Java缓存框架 jscache
比Spring Cache 更好用 更简单的缓存工具 jscache 取名意义为 java simple cache,基于AOP实现,支持注解到接口 自定义单个缓存过期时间配置 ttl,轻松扩展缓存实 ...
- web 框架的本质及自定义web框架 模板渲染jinja2 mvc 和 mtv框架 Django框架的下载安装 基于Django实现的一个简单示例
Django基础一之web框架的本质 本节目录 一 web框架的本质及自定义web框架 二 模板渲染JinJa2 三 MVC和MTV框架 四 Django的下载安装 五 基于Django实现的一个简单 ...
- vue—你必须知道的 js数据类型 前端学习 CSS 居中 事件委托和this 让js调试更简单—console AMD && CMD 模式识别课程笔记(一) web攻击 web安全之XSS JSONP && CORS css 定位 react小结
vue—你必须知道的 目录 更多总结 猛戳这里 属性与方法 语法 计算属性 特殊属性 vue 样式绑定 vue事件处理器 表单控件绑定 父子组件通信 过渡效果 vue经验总结 javascript ...
随机推荐
- hdu1247 字典树或者hash
题意: 给你一些串,问你哪些串是由其他两个串连接成的. 思路: 我用了两种方法,一个是hash,hash的时候用map实现的,第二种方法是字典树,字典树我们枚举每个一字符串,查 ...
- Aircrack-ng破解无线WIFI密码
首先,如果kali是装在虚拟机里面的话,是不能用物理机的无线网卡的.所以,如果我们要想进行无线破解,需要外接一个无线网卡设备,并且该设备要支持 monitor 监听模式 iwconfig :系统配置无 ...
- Portswigger web security academy:Reflected XSS
Portswigger web security academy:Reflected XSS 目录 Portswigger web security academy:Reflected XSS Ref ...
- Day002 Java三大版本
Java三大版本 Write Once .Run Anywhere JavaSE: 标准版(桌面程序,控制台开发......) JavaME:嵌入式开发(手机,小家电.......) JavaEE:E ...
- 将一个eclipse的SSM项目用IDEA打开并运行
项目部署 将一个eclipse项目用idea打开,并且 部署到tomcat中 .或者你tomcat部署成功,但是启动就是404,下面的步骤就要更认真看了 项目配置 打开idea,Import Proj ...
- ThinkPHP5.1 输出到模板HTML格式被强行转成了字符
出现问题 控制器传给视图一个input标签,在视图页面显示出来就是 <input type='text'></input>,显示出来的是一个文本,而不是一个可以输入的文本框 解 ...
- @shiro.hasPermission 使用
在页面上加上@shiro.hasPermission 如下用.ftl为例子: 当加上shiro标签后,会与后台代码结合使用: 需要继承AuthorizingRealm 下的 protected Au ...
- Morgan Stanley Books List:经典金融书籍推荐
一.经济学 1. 中华帝国的专制制度,佛朗索瓦.魁奈 2. 资本论(共3卷),马恩全集 3. 国家竞争优势,麦克尔.波特 4. Essentials of corporate analysis, by ...
- str.isdigit()可以判断变量是否为数字
字符串.isdigit()可以判断变量是否为数字 是则输出True 不是则输出False 好像只能字符串
- .Net core Worker Service 扩展库
.Net core Worker Service 扩展库,目的为更易控制每一个worker 的运行. 提供根据配置文件对每一个Worker的停止.启动和自动解析注册Worker. 获取配置的方式不限于 ...