Sa-Token v1.23.0 更新, 正式支持OAuth2.0授权认证

Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证、权限认证、Session会话、单点登录、OAuth2.0 等一系列权限相关问题

框架集成简单、开箱即用、API设计清爽,通过Sa-Token,你将以一种极其简单的方式实现系统的权限认证部分

Sa-Token v1.23.0 版本更新主要新增OAuth模块,Sa-OAuth2 模块基于 RFC-6749 标准 编写,通过Sa-OAuth2你可以非常轻松的实现系统的OAuth2.0授权认证

  1. 授权码(Authorization Code):OAuth2.0标准授权步骤,Server端向Client端下放Code码,Client端再用Code码换取授权Token
  2. 隐藏式(Implicit):无法使用授权码模式时的备用选择,Server端使用URL重定向方式直接将Token下放到Client端页面
  3. 密码式(Password):Client直接拿着用户的账号密码换取授权Token
  4. 客户端凭证(Client Credentials):Server端针对Client级别的Token,代表应用自身的资源授权

代码仓库地址:
- Github:https://github.com/dromara/Sa-Token
- Gitee:https://gitee.com/dromara/sa-token


搭建示例:

1、准备工作

首先修改hosts文件(C:\windows\system32\drivers\etc\hosts),添加以下IP映射,方便我们进行测试:

127.0.0.1 sa-oauth-server.com
127.0.0.1 sa-oauth-client.com
  • 1
  • 2

2、引入依赖

创建SpringBoot项目 sa-token-demo-oauth2-server(不会的同学自行百度或参考仓库示例),添加pom依赖:

<!-- Sa-Token 权限认证, 在线文档:http://sa-token.com/ -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>${sa.top.version}</version>
</dependency>

<!-- Sa-Token-OAuth2.0 模块 -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-oauth2</artifactId>
    <version>${sa.top.version}</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3、开放服务

1、新建 SaOAuth2TemplateImpl

/**
 * Sa-Token OAuth2.0 整合实现 
 */
@Component
public class SaOAuth2TemplateImpl extends SaOAuth2Template {

    // 根据 id 获取 Client 信息 
    @Override
    public SaClientModel getClientModel(String clientId) {
        // 此为模拟数据,真实环境需要从数据库查询 
        if("1001".equals(clientId)) {
            return new SaClientModel()
                    .setClientId("10001")
                    .setClientSecret("aaaa-bbbb-cccc-dddd-eeee")
                    .setAllowUrl("*")
                    .setContractScope("userinfo");
        }
        return null;
    }

    // 根据ClientId 和 LoginId 获取openid 
    @Override
    public String getOpenid(String clientId, Object loginId) {
        // 此为模拟数据,真实环境需要从数据库查询 
        return "gr_SwoIN0MC1ewxHX_vfCW3BothWDZMMtx__";
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

2、新建SaOAuth2ServerController

/**
 * Sa-OAuth2 Server端 控制器 
 */
@RestController
public class SaOAuth2ServerController {

    // 处理所有OAuth相关请求 
    @RequestMapping("/oauth2/*")
    public Object request() {
        System.out.println("------- 进入请求: " + SaHolder.getRequest().getUrl());
        return SaOAuth2Handle.serverRequest();
    }

    // Sa-OAuth2 定制化配置 
    @Autowired
    public void setSaOAuth2Config(SaOAuth2Config cfg) {
        cfg.
            // 配置:未登录时返回的View 
            setNotLoginView(() -> {
                String msg = "当前会话在SSO-Server端尚未登录,请先访问"
                            + "<a href='/oauth2/doLogin?name=sa&pwd=123456' target='_blank'> doLogin登录 </a>"
                            + "进行登录之后,刷新页面开始授权";
                return msg;
            }).
            // 配置:登录处理函数 
            setDoLoginHandle((name, pwd) -> {
                if("sa".equals(name) && "123456".equals(pwd)) {
                    StpUtil.login(10001);
                    return SaResult.ok();
                }
                return SaResult.error("账号名或密码错误");
            }).
            // 配置:确认授权时返回的View 
            setConfirmView((clientId, scope) -> {
                String msg = "<p>应用 " + clientId + " 请求授权:" + scope + "</p>"
                        + "<p>请确认:<a href='/oauth2/doConfirm?client_id=" + clientId + "&scope=" + scope + "' target='_blank'> 确认授权 </a></p>"
                        + "<p>确认之后刷新页面</p>";
                return msg;
            })
            ;
    }

    // 全局异常拦截  
    @ExceptionHandler
    public SaResult handlerException(Exception e) {
        e.printStackTrace(); 
        return SaResult.error(e.getMessage());
    }

}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50

注意:在setDoLoginHandle函数里如果要获取name, pwd以外的参数,可通过SaHolder.getRequest().getParam("xxx")来获取

3、创建启动类:

/**
 * 启动:Sa-OAuth2 Server端 
 */
@SpringBootApplication 
public class SaOAuth2ServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(SaOAuth2ServerApplication.class, args);
        System.out.println("\nSa-Token-OAuth Server端启动成功");
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

启动项目

4、访问测试

1、由于暂未搭建Client端,我们可以使用Sa-Token官网作为重定向URL进行测试:

http://sa-oauth-server.com:8001/oauth2/authorize?response_type=code&client_id=1001&redirect_uri=http://sa-token.com/&scope=userinfo
  • 1

2、由于首次访问,我们在OAuth-Server端暂未登录,会被转发到登录视图

sa-oauth2-server-login-view

3、点击doLogin进行登录之后刷新页面,会提示我们确认授权
sa-oauth2-server-login-view

4、点击确认授权之后刷新页面,我们会被重定向至 redirect_uri 页面,并携带了code参数

sa-oauth2-server-code

4、我们拿着code参数,访问以下地址:

http://sa-oauth-server.com:8001/oauth2/token?grant_type=authorization_code&client_id=1001&client_secret=aaaa-bbbb-cccc-dddd-eeee&code={code}
  • 1

将得到 Access-TokenRefresh-Tokenopenid等授权信息

sa-oauth2-server-token

测试完毕

详细参考文档:http://sa-token.com/doc/index.html#/oauth2/readme

← Sa-Token v.1.31.0 新增拦截器 SaInterceptor 功能说明,以及旧代码迁移示例 Sa-Token v1.31.0 更新,新增账号分类封禁、阶梯封禁功能 →

当前博客已开放版权,所有人均可免费转载,无需联系 Sa-Token 团队获取授权。只需要在转载时保留底部 Sa-Token 官网链接 + 开源仓库链接即可。

Copyright ©2026 Sa-Token java 权限认证 | sa-token.com | 鲁ICP备18046274号-5 | 鲁公网安备37011202002956号