Sa-Token - 功能最全的 Java 权限认证框架

createh51个月前 (12-11)技术教程26

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

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

简介

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

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

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

  • 简单 :可零配置启动框架,真正的开箱即用,低成本上手
  • 强大:目前已集成几十项权限相关特性,涵盖了大部分业务场景的解决方案
  • 易用:如丝般顺滑的 API 调用,大量高级特性统统只需一行代码即可实现
  • 高扩展:几乎所有组件都提供了扩展接口,90% 以上的逻辑都可以按需重写

使用

要在项目中使用 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集成和共享数据中心两种分布式会话方案
  • 单点登录 —— 一处登录,处处通行
  • 模拟他人账号 —— 实时操作任意用户状态数据
  • 临时身份切换 —— 将会话身份临时切换为其它账号
  • 无Cookie模式 —— APP、小程序等前后台分离场景
  • 同端互斥登录 —— 像QQ一样手机电脑同时在线,但是两个手机上互斥登录
  • 多账号认证体系 —— 比如一个商城项目的user表和admin表分开鉴权
  • 花式token生成 —— 内置六种token风格,还可自定义token生成策略
  • 注解式鉴权 —— 优雅的将鉴权与业务代码分离
  • 路由拦截式鉴权 —— 根据路由拦截鉴权,可适配restful模式
  • 自动续签 —— 提供两种token过期策略,灵活搭配使用,还可自动续签
  • 会话治理 —— 提供方便灵活的会话查询接口
  • 记住我模式 —— 适配[记住我]模式,重启浏览器免验证
  • 密码加密 —— 提供密码加密模块,可快速MD5、SHA1、SHA256、AES、RSA加密
  • 组件自动注入 —— 零配置与Spring等框架集成

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 还有很多“一行式”的代码,可以通过高度抽象的 API 完成复杂的功能:

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


总结

Sa-Token 作为一个轻量级 Java 权限认证框架,接口简洁,功能强大,简单易用,可扩展性强,能够适应多种业务场景,无需繁琐的配置文件和和全局过滤器,就能实现复杂和身份认证和权限控制,十分值得尝试使用。

相关文章

Java程序员证书怎么考?Java程序员含金量怎么样,报考条件是什么

Java的应用可以说是无处不在,从桌面办公应用到网络数据库等应用,从PC到嵌入式移动平台,从Java小应用程序(Applet)到架构庞大的J2EE企业级解决方案,处处都有Java的身影,就连美国大型太...

Java,SSL/TLS协议,单向和双向认证,命令制作及代码生成证书

概念SSL/TLS协议SSL(Secure Sockets Layer),安全套接字协议,是为网络通信提供安全及数据完整性的一种安全协议。SSL主要是使用公开密钥体制和X.509数字证书技术保护信息传...

Java微服务统一授权认证架构设计及实现

Java微服务统一授权认证架构设计及实现统一鉴权认证是一个基础服务。它几乎在所有企业内部都需要,企业内部只要有两个以上系统存在,就有必要实现一套统一的授权系统,否则用户使用非常地麻烦,需要在不同系统之...

纯干货!Spring Cloud Gateway整合OAuth2.0 实现分布式统一认证授权

今天这篇文章介绍一下Spring Cloud Gateway整合OAuth2.0实现认证授权,涉及到的知识点有点多,有不清楚的可以看下陈某的往期文章。文章目录如下:微服务认证方案微服务认证方案目前有很...