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

原文链接: https://blog.csdn.net/weixin_60414376/article/details/122989980

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

posted @ 2022-05-13 17:32  枫树湾河桥  阅读(1021)  评论(0编辑  收藏  举报
Live2D