栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot(51) 整合Sa-Token实现权限认证

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot(51) 整合Sa-Token实现权限认证

文章目录
      • 一、前言
      • 二、整合Sa-Token实现权限认证
        • 1、`pom.xml`中引入依赖
        • 2、`application.yml`配置
        • 3、自定义sa-token生成策略
        • 4、Sa-Token 拦截/开放 URL 配置类
        • 5、注册 Sa-Token 路由拦截器
        • 6、全局异常处理器
      • 三、测试
      • 本文案例demo源码

一、前言

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

https://sa-token.dev33.cn/doc/index.html#/

二、整合Sa-Token实现权限认证 1、pom.xml中引入依赖

    cn.dev33
    sa-token-spring-boot-starter
    1.27.0




    cn.dev33
    sa-token-dao-redis-jackson
    1.27.0




    org.apache.commons
    commons-pool2

2、application.yml配置

温馨小提示:这里的配置是假设前后端分离情况下,通过请求头参数信息进行认证~

spring:
  # redis配置
  redis:
    # Redis数据库索引(默认为0)
    database: 1
    # Redis服务器地址
    host: 127.0.0.1
    # Redis服务器连接端口
    port: 6379
    # Redis服务器连接密码(默认为空)
    # password: 
    # 连接超时时间
    timeout: 10s
    lettuce:
      pool:
        # 连接池最大连接数
        max-active: 200
        # 连接池最大阻塞等待时间(使用负值表示没有限制)
        max-wait: -1ms
        # 连接池中的最大空闲连接
        max-idle: 10
        # 连接池中的最小空闲连接
        min-idle: 0


# Sa-Token配置
sa-token:
  # token名称 (同时也是cookie名称)  注意不能带冒号:
  token-name: test-satoken
  # token有效期,单位s 这里设置2分钟, -1代表永不过期
  timeout: 120
  # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
  activity-timeout: -1
  # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
  is-concurrent: true
  # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
  is-share: false
  # token风格
  token-style: random-128
  # 是否从cookie中读取token
  is-read-cookie: false
  # 是否从请求体里读取token
  is-read-body: false
  # 是否从head中读取token
  is-read-head: true
  # 是否输出操作日志
  is-log: true
  # 拦截url
  intercept-url-list:
    - /test/**
  # 开放url
  open-url-list:
    - /test/doLogin
    - /test/time
3、自定义sa-token生成策略
@Configuration
public class SaTokenCustomConfig {

    
    @Autowired
    public void rewriteSaStrategy() {
        // 重写 Token 生成策略
        SaStrategy.me.createToken = (loginId, loginType) -> {
            // 随机60位长度字符串
            return SaFoxUtil.getRandomString(60);
        };
    }

}
4、Sa-Token 拦截/开放 URL 配置类
@Data
@Configuration
@ConfigurationProperties(prefix = "sa-token", ignoreUnknownFields = true)
public class SaTokenUrlConfig {

    
    private List interceptUrlList;

    
    private List openUrlList;

}
5、注册 Sa-Token 路由拦截器
@Configuration
public class SaTokenWebMvcConfig implements WebMvcConfigurer {

    @Autowired
    private SaTokenUrlConfig saTokenUrlConfig;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册1个登录认证拦截器
        registry.addInterceptor(new SaRouteInterceptor())
                .addPathPatterns(this.saTokenUrlConfig.getInterceptUrlList())
                .excludePathPatterns(this.saTokenUrlConfig.getOpenUrlList());
    }

}
6、全局异常处理器
@Slf4j
@RestControllerAdvice
public class MyGlobalExceptionHandler {

    @ExceptionHandler({SaTokenException.class})
    public SaResult saTokenException(SaTokenException e) {
        log.error("SaTokenException: ", e);
        return SaResult.error(e.getMessage());
    }

    @ExceptionHandler({NotLoginException.class})
    public SaResult notLoginException(NotLoginException e) {
        log.error("NotLoginException: ", e);
        return SaResult.error(e.getMessage());
    }

}
三、测试
@Slf4j
@RestController
@RequestMapping("/test")
@Api(tags = "测试api")
public class TestController {

    @GetMapping("time")
    @ApiOperation("time")
    public String time() {
        log.info("time: {}", DateTime.now());
        return DateTime.now().toString();
    }

    @GetMapping("getSaTokenConfig")
    @ApiOperation("Sa-Token配置")
    public SaTokenConfig getSaTokenConfig() {
        log.info("Sa-Token配置:{}", SaManager.getConfig());
        return SaManager.getConfig();
    }

    @GetMapping("doLogin")
    @ApiOperation("登录")
    public String doLogin(String username, String password) {
        // 此处仅作模拟示例,真实项目需要从数据库中查询数据进行比对
        if ("zhang".equals(username) && "123456".equals(password)) {
            StpUtil.logout();
            StpUtil.login(10001);
            return "登录成功" + StpUtil.getLoginId();
        }
        StpUtil.logout();
        return "登录失败";
    }

    @GetMapping("isLogin")
    @ApiOperation("查询登录状态")
    public String isLogin() {
        return "当前会话是否登录:" + StpUtil.isLogin();
    }

    @GetMapping("logout")
    @ApiOperation("退出登录")
    public String logout(String loginId) {
        StpUtil.logoutByLoginId(loginId);
        return "SUCCESS";
    }

    @GetMapping("checkLogin")
    @ApiOperation("检查是否登录")
    public String checkLogin() {
        try {
            StpUtil.checkLogin();
        } catch (Exception e) {
            log.info("登录认证失效:{}", e.getMessage());
            return "FAIL:" + e.getMessage();
        }
        log.info("登录了...");
        return "SUCCESS";
    }

    @GetMapping("tokenInfo")
    @ApiOperation("查询Token信息")
    public SaResult tokenInfo() {
        return SaResult.data(StpUtil.getTokenInfo());
    }

    @GetMapping("getTokenValueByLoginId")
    @ApiOperation("获取账号id为10001的token令牌值")
    public String getTokenValueByLoginId() {
        return StpUtil.getTokenValueByLoginId(10001);
    }

}

接口文档 http://127.0.0.1/doc.html

其它的自己看着sa-token官方文档玩吧, 比较简单,就不多展示了^_^

本文案例demo源码

https://gitee.com/zhengqingya/java-workspace


今日分享语句:
你在学习上这种尝试精神很可贵。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/425086.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号