Sa-token给用户分配权限或分配角色

 

本文以一个小案例实现登录与权限模块的开发,大致是数据库有两个用户一个是超级管理员一个是普通用户,只有超级管理员有查询所有信息的权限,普通用户点击查询所有用户显示您未有相关权限

1、登录页面

2、管理员查询:

3、学生查询:

 数据库:

 

一)登录模块开发

1、去yml文件中配置sa-token的基本配置:

# Sa-Token配置
sa-token:
  # token名称 (同时也是cookie名称)
  token-name: token
  # token有效期,单位s 默认30天, -1代表永不过期
  timeout: 2592000
  # token临时有效期 (指定时间内无操作就视为token过期) 单位: 秒
  activity-timeout: -1
  # 是否允许同一账号并发登录 (为true时允许一起登录, 为false时新登录挤掉旧登录)
  is-concurrent: true
  # 在多人登录同一账号时,是否共用一个token (为true时所有登录共用一个token, 为false时每次登录新建一个token)
  is-share: false
  # token风格
  token-style: uuid
  # 是否输出操作日志
  is-log: false

 2、在controller类中书写登录方法:

最重要的就是将token返回以及id属性的绑定

@RestController
@RequestMapping("/test")
@Tag(name = "权限验证")
public class test {

    @Autowired
    private signImpl signService;
    
    @PostMapping("/signs")
    @Operation(summary = "数据库登录")
    public R sign(@Valid @RequestBody signForm info) {
        signService.canSign(info.getUserName(), info.getPassWord());
        Integer id = signService.searchUserId(info.getUserName());
        //将ID绑定在登录模块,后期授权有用
        StpUtil.login(id);
        String tokenValue = StpUtil.getTokenValue();
        //在登录模块必须将Token返回给前端,否则前端调用某些方法会显示未发现Token信息异常
        return new R().put("code", 200).put("msg", "登陆成功").put("token", tokenValue);
    }
}

 

二)权限模块开发

        1、构建一个自定义权限的类,实现StpInterface,重写里面的方法。

o默认是String类型,所以必须调用Integer的parse方法将其转化为整型才能使用       

package com.example.mineemos.Util;

import cn.dev33.satoken.stp.StpInterface;
import cn.dev33.satoken.stp.StpUtil;
import com.example.mineemos.db.dao.InforDao;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;
@Component
public class authorGive implements StpInterface {
    @Autowired
    private InforDao inforDao;

    //添加某些权限可以访问的
    @Override
    public List<String> getPermissionList(Object o, String s) {
        return null;
    }

    //添加某些角色可以访问的
    @Override
    public List<String> getRoleList(Object o, String lognType) {
        //o属性就是刚刚绑定的id,通过这个id去数据库查询权限
        Integer id= Integer.parseInt((String) o);
        String role = inforDao.searchRole(id);
        List<String> list = new ArrayList<String>();
        //“*”权限表示什么都可以访问
        list.add(role);
        return list;
    }
}

2、因为要将权限注解打在方法上,所以要先注册拦截器:

@Configuration
public class SaTokenConfig implements WebMvcConfigurer {
    // 注册Sa-Token的注解拦截器,打开注解式鉴权功能
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 注册注解拦截器,并排除不需要注解鉴权的接口地址 (与登录拦截器无关)
        registry.addInterceptor(new SaAnnotationInterceptor()).addPathPatterns("/**");
    }
}

3、这时候就可以在查询信息的那个接口上打上对应的注解了。

    // 角色认证:必须具有指定角色才能进入该方法
    @SaCheckRole("管理员")
    @Operation(summary = "只有管理员身份才能")
    @PostMapping("/add")
    public R add() {
        List<Infor> infors = signService.searchAll();
        return new R().put("msg", "成功").put("info",infors);
    }

官方文档地址:

Sa-Token

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值