Sa-Token登录权限认证

该文章已生成可运行项目,

环境:SpringBoot3、jdk17

Sa-TokenSa-Token是一个java权限认证框架,功能全面,上手简单,登录认证、权限认证、Session会话、踢人下线、账号封禁、集成Redis、前后端分离、分布式会话、微服务网关鉴权、单点登录、OAuth2.0、临时Token验证、记住我模式、模拟他人账号、临时身份切换、多账号体系、注解式鉴权、路由拦截式鉴权、花式token、自动续签、同端互斥登录、会话治理、密码加密、jwt集成、Spring集成、WebFlux集成...,有了sa-token,你所有的权限认证问题,都不再是问题https://sa-token.cc/index.html        Sa-Token 是一个轻量级、无侵入、功能强大的 Java 权限认证框架。轻量级:核心依赖少,性能强大,能够快速上手;无侵入:通过注解和拦截器实现权限控制;

1.导入依赖

<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot3-starter</artifactId>

    <version>1.38.0</version>
</dependency>

<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-redis-jackson</artifactId>

    <version>1.38.0</version>
</dependency>

2.添加配置

############## Sa-Token 配置 (文档: https://sa-token.cc) ##############
sa-token: 
    # token 名称(同时也是 cookie 名称)
    token-name: satoken
    # token 有效期(单位:秒) 默认30天,-1 代表永久有效
    timeout: 2592000
    # token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
    active-timeout: -1
    # 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
    is-concurrent: true
    # 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
    is-share: false
    # token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
    token-style: uuid
    # 是否输出操作日志 
    is-log: true

3.登录认证

        服务器校验账号密码,为用户颁发 Token 会话凭证;

3.1 登录接口

    /**
     * 登录
     * @param loginVo
     * @return
     */
    @PostMapping("/login")
    public Result login(@RequestBody LoginData loginData) {
        //Sa-token认证登录
        StpUtil.login(user.getId());
        //返回结果初始化
        JSONObject result = new JSONObject();
        //保存登录信息: 令牌 + 刷新令牌(用于令牌过期或快过期申请新令牌使用)
        result.putOpt("token", StpUtil.getTokenValue());
        return Result.ok(result);
    }
  • StpUtil.login(id) 方法利用了 Cookie 自动注入的特性,甚至你都不需要主动向前端返回 token 信息;
  • 其他还有 StpUtil.logout() 注销、StpUtil.isLogin() 是否登录等提供的方法;

3.2 配置拦截器

@Component
public class SaTokenInterceptor implements WebMvcConfigurer {

    /**
     * 新增拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new SaInterceptor(handle-> {
                    //Sa-token框架校验
                    StpUtil.checkLogin();
                })).addPathPatterns("/**") //拦截范围
                .excludePathPatterns("/auth/login",//放行登录接口
                        "/auth/validateCode",//放行验证码接口
                        "/doc.html", "/v3/api-docs/**", "/webjars/**","/favicon.ico");//放行swagger相关接口
    }
}

4.权限认证

        框架校验账户拥有的权限码集合中是否包含指定的权限码;

4.1 获取当前账号权限码集合

/***
 * 自定义权限加载接口实现类
 */
@Component
public class StpInterfaceImpl implements StpInterface {

    @Autowired
    private SysMenuMapper sysMenuMapper;

    /**
     * 返回一个账号所拥有的权限码集合 
     * @param loginId
     * @param loginType
     * @return
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        //查询用户的功能权限
        return sysMenuMapper.selectUserPermsByUserId(Long.parseLong(loginId.toString()));
    }

    @Autowired
    private SysUserRoleMapper sysUserRoleMapper;
    /**
     * 返回一个账号所拥有的角色标识集合
     * @param loginId
     * @param loginType
     * @return
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        return sysUserRoleMapper.selectRoleCodesByUserId(Long.parseLong(loginId.toString()));
    }
}

4.2 注解鉴权

  • @SaCheckLogin:登录校验 —— 只有登录之后才能进入该方法。
  • @SaCheckRole("admin"):角色校验 —— 必须具有指定角色标识才能进入该方法。
  • @SaCheckPermission("user:add"):权限校验 —— 必须具有指定权限才能进入该方法。
  • @SaCheckSafe:二级认证校验 —— 必须二级认证之后才能进入该方法。
  • @SaCheckHttpBasic:HttpBasic校验 —— 只有通过 HttpBasic 认证后才能进入该方法。
  • @SaCheckHttpDigest:HttpDigest校验 —— 只有通过 HttpDigest 认证后才能进入该方法。
  • @SaCheckDisable("comment"):账号服务封禁校验 —— 校验当前账号指定服务是否被封禁。
  • @SaCheckSign:API 签名校验 —— 用于跨系统的 API 签名参数校验。
  • @SaIgnore:忽略校验 —— 表示被修饰的方法或类无需进行注解鉴权和路由拦截器鉴权。
    @SaCheckPermission("list")
    @SaCheckRole("6")
    @GetMapping(value = "/list")
    public Result list(){
        return Result.ok(service.list();
    }
本文章已经生成可运行项目
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值