java权限框架(java数据权限实现方案)

java权限框架(java数据权限实现方案)

身份认证和权限鉴别,是大多数系统都需要实现的逻辑。从最简单的小型网站的用户登录,到极为庞大复杂的企业级用户权限控制,权限认证可以只是简单的判断查询,也可以是多种权限模型和身份验证方式的复杂混合。

对于 Java 生态而言,权限认证早已是老生常谈,如 Shiro、Security 等的传统框架已是必经之路。然而,有没有更为简洁、能写更少代码和配置、更为符合实际业务需求的框架呢?Sa-Token 或许是一个更好的选择。

sa-token

◆简介

Sa-Token,是 click33 在 Github 上开源的轻量级 Java 权限认证框架,目前版本为 v1.15.2。

Sa-Token 框架,主要解决的是:登录认证、权限认证、Session会话、单点登录、OAuth2.0 等一系列权限相关问题。框架针对:踢人下线、自动续签、前后台分离、分布式会话等常见业务进行了适配,使开发者可以以一种极简的方式实现系统的权限认证逻辑。

与其他 Java 权限认证框架相比,sa-token 具有以下优势:

简单:可零配置启动框架,真正的开箱即用,低成本上手

强大:目前已集成几十项权限相关特性,涵盖了大部分业务场景的解决方案

易用:如丝般顺滑的 API 调用,大量高级特性统统只需一行代码即可实现

高扩展:几乎所有组件都提供了扩展接口,90% 以上的逻辑都可以按需重写

sa-token

◆使用

要在项目中使用 Sa-Token,可以通过 Maven 引入,在 pom.xml 中加入依赖:

<dependency> <groupId>cn.dev33</groupId> <artifactId>sa-token-spring-boot-starter</artifactId> <version>1.15.0.RELEASE</version></dependency>

也可以通过 Gradle 引入:

implementation ‘cn.dev33:sa-token-spring-boot-starter:1.15.0.RELEASE’

Sa-Token 功能强大,覆盖全面,包括:

登录验证—— 轻松登录鉴权,并提供五种细分场景值

权限验证—— 适配RBAC权限模型,不同角色不同授权

Session会话—— 专业的数据缓存中心

踢人下线—— 将违规用户立刻清退下线

持久层扩展—— 可集成Redis、Memcached等专业缓存中间件,重启数据不丢失

分布式会话—— 提供jwt集成和共享数据中心两种分布式会话方案

单点登录—— 一处登录,处处通行

模拟他人账号—— 实时操作任意用户状态数据

临时身份切换—— 将会话身份临时切换为其它账号

多账号认证体系—— 比如一个商城项目的user表和admin表分开鉴权

花式token生成—— 内置六种token风格,还可自定义token生成策略

注解式鉴权—— 优雅的将鉴权与业务代码分离

路由拦截式鉴权—— 根据路由拦截鉴权,可适配restful模式

自动续签—— 提供两种token过期策略,灵活搭配使用,还可自动续签

会话治理—— 提供方便灵活的会话查询接口

记住我模式—— 适配[记住我]模式,重启浏览器免验证

密码加密—— 提供密码加密模块,可快速MD5、SHA1、SHA256、AES、RSA加密

组件自动注入—— 零配置与Spring等框架集成

sa-token

Sa-Token 接口简洁,使用方便。如果我们想要实现登录和注销,sa-token 提供了以下方式:

// 标记当前会话登录的账号id // 建议的参数类型:long | int | String, 不可以传入复杂类型,如:User、Admin等等StpUtil.setLoginId(Object loginId); // 当前会话注销登录StpUtil.logout();// 获取当前会话是否已经登录,返回true=已登录,false=未登录StpUtil.isLogin();// 检验当前会话是否已经登录, 如果未登录,则抛出异常:`NotLoginException`StpUtil.checkLogin()

Sa-Token 还提供了可扩展性极强的权限验证实现。Sa-Token 把【获取当前账号权限码集合】的操作以接口方式暴露,开发者只需实现 StpInterface 接口:

package com.pj.satoken;import java.util.ArrayList;import java.util.List;import org.springframework.stereotype.Component;import cn.dev33.satoken.stp.StpInterface;/** * 自定义权限验证接口扩展 */@Component // 保证此类被SpringBoot扫描,完成sa-token的自定义权限验证扩展 public class StpInterfaceImpl implements StpInterface { /** * 返回一个账号所拥有的权限码集合 */ @Override public List<String> getPermissionList(Object loginId, String loginKey) { // 本list仅做模拟,实际项目中要根据具体业务逻辑来查询权限 List<String> list = new ArrayList<String>(); list.add(“101”); list.add(“user-add”); list.add(“user-delete”); list.add(“user-update”); list.add(“user-get”); list.add(“article-get”); return list; } /** * 返回一个账号所拥有的角色标识集合 (权限与角色可分开校验) */ @Override public List<String> getRoleList(Object loginId, String loginKey) { // 本list仅做模拟,实际项目中要根据具体业务逻辑来查询角色 List<String> list = new ArrayList<String>(); list.add(“admin”); list.add(“super-admin”); return list; }}

然后,我们就可以用以下的 API 来实现鉴权了:

// 当前账号是否含有指定权限, 返回true或false StpUtil.hasPermission(“user:update”); // 当前账号是否含有指定权限, 如果验证未通过,则抛出异常: NotPermissionException StpUtil.checkPermission(“user:update”); // 当前账号是否含有指定权限 [指定多个,必须全部验证通过] StpUtil.checkPermissionAnd(“user:update”, “user:delete”); // 当前账号是否含有指定权限 [指定多个,只要其一验证通过即可] StpUtil.checkPermissionOr(“user:update”, “user:delete”);

sa-token

除此之外,Sa-Token 还有很多“一行式”的代码,可以通过高度抽象的 API 完成复杂的功能:

StpUtil.setLoginId(10001); // 标记当前会话登录的账号idStpUtil.getLoginId(); // 获取当前会话登录的账号idStpUtil.isLogin(); // 获取当前会话是否已经登录, 返回true或falseStpUtil.logout(); // 当前会话注销登录StpUtil.logoutByLoginId(10001); // 让账号为10001的会话注销登录(踢人下线)StpUtil.hasRole(“super-admin”); // 查询当前账号是否含有指定角色标识, 返回true或falseStpUtil.hasPermission(“user:add”); // 查询当前账号是否含有指定权限, 返回true或falseStpUtil.getSession(); // 获取当前账号id的SessionStpUtil.getSessionByLoginId(10001); // 获取账号id为10001的SessionStpUtil.getTokenValueByLoginId(10001); // 获取账号id为10001的token令牌值StpUtil.setLoginId(10001, “PC”); // 指定设备标识登录StpUtil.logoutByLoginId(10001, “PC”); // 指定设备标识进行强制注销 (不同端不受影响)StpUtil.switchTo(10044); // 将当前会话身份临时切换为其它账号

◆总结

sa-token

https://www.toutiao.com/i6944344522021388808/

来都来了,走啥走,留个言呗~

IT大咖说 |关于版权

感谢您对IT大咖说的热心支持!

相关推荐

推荐文章

这一份最全的TCP总结,请务必收下

从php到Golang系统的演变

OneForAll – 功能强大的子域收集工具

老生常谈:MySQL高可用架构

DevOps软件架构师行动指南-读书笔记整理

微服务分解策略

Fes.js – 一个优秀的前端应用解决方案

发表评论

登录后才能评论