整合Satoken _ 注解鉴权(RuoYi项目)

引入依赖

<!-- 权限校验相关 -->
<sa.token.version>1.37.0</sa.token.version>

<!-- Sa-Token 依赖配置(依赖配置是redis+token) -->
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-core</artifactId>
    <version>${sa.token.version}</version>
</dependency>
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-spring-boot-starter</artifactId>
    <version>${sa.token.version}</version>
</dependency>
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-jwt</artifactId>
    <version>${sa.token.version}</version>
</dependency>
<dependency>
    <groupId>cn.dev33</groupId>
    <artifactId>sa-token-redis-jackson</artifactId>
    <version>${sa.token.version}</version>
</dependency>

配置文件

sa-token:
  # token 名称(同时也是 cookie 名称)
  token-name: Authorization
  # 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: tik
  # 是否输出操作日志
  is-log: true
  # 防止出现token生成失败, 算法过于简单或资源池耗尽
  max-try-times: 100
  jwt-secret-key: abcdefghijklmnopqrstuvwxyz

添加配置

@Configuration
public class SaTokenConfig implements WebMvcConfigurer {

	// 令牌秘钥
	@Value("${token.secret}")
	private String secret;

	// 注册 Sa-Token 拦截器,打开注解式鉴权功能
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// 注册 Sa-Token 拦截器,打开注解式鉴权功能
		registry.addInterceptor(new SaInterceptor()).addPathPatterns("/**");
	}

	// Sa-Token 整合 jwt (Simple 简单模式)
	@Bean
	public StpLogic getStpLogicJwt() {
		return new StpLogicJwtForSimple();
	}

	/**
	 * 自定义 SaJwtUtil 生成 token 的算法
     * 这一步看情况是否要加, 如果项目自带的token生成策略不一致就改成一致的
     * 下面的算法策略是RuoYi项目的, 但经过部分修改之后的
	 */
	@Autowired
	public void setSaJwtTemplate() {
		SaJwtUtil.setSaJwtTemplate(new SaJwtTemplate() {
			@Override
			public String generateToken(JWT jwt, String key) {
				String token = LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));
				LoginUser loginUser = BaseContext.getLoginUser();
				Map<String, Object> claims = new HashMap<>();
				claims.put(Constants.LOGIN_USER_KEY, token);
				claims.put(Constants.LOGIN_USER_ID, loginUser.getUserId());
				claims.put(Constants.LOGIN_USER_NAME, loginUser.getUser().getUserName());
				claims.put(Constants.LOGIN_USER_MAIL,loginUser.getEmail());
				claims.put(Constants.LOGIN_USER_AVATAR,loginUser.getAvatar());
				// 自定义算法
				return Jwts.builder()
						.setClaims(claims)
						.signWith(SignatureAlgorithm.HS512, secret).compact();
			}
		});
	}

}
@Component
public class SaPermissionImpl implements StpInterface {

    /**
     * 获取菜单权限列表
     */
    @Override
    public List<String> getPermissionList(Object loginId, String loginType) {
        LoginUser loginUser = BaseContext.getLoginUser();
        return new ArrayList<>(loginUser.getMenuPermission());
    }

    /**
     * 获取角色权限列表
     */
    @Override
    public List<String> getRoleList(Object loginId, String loginType) {
        LoginUser loginUser = BaseContext.getLoginUser();
        return new ArrayList<>(loginUser.getRolePermission());
    }

}
  • @SaCheckLogin: 登录校验 —— 只有登录之后才能进入该方法。
  • @SaCheckRole(“admin”): 角色校验 —— 必须具有指定角色标识才能进入该方法。
  • @SaCheckPermission(“user:add”): 权限校验 —— 必须具有指定权限才能进入该方法。
  • @SaCheckSafe: 二级认证校验 —— 必须二级认证之后才能进入该方法。
  • @SaCheckHttpBasic: HttpBasic校验 —— 只有通过 HttpBasic 认证后才能进入该方法。
  • @SaCheckHttpDigest: HttpDigest校验 —— 只有通过 HttpDigest 认证后才能进入该方法。
  • @SaIgnore:忽略校验 —— 表示被修饰的方法或类无需进行注解鉴权和路由拦截器鉴权。
  • @SaCheckDisable(“comment”):账号服务封禁校验 —— 校验当前账号指定服务是否被封禁。

代码测试

/**
 * 登录认证注解测试
 */
@RestController
public class LoginController {

    // 访问 home 页,登录后才能访问  ---- http://localhost:8081/home
    @SaCheckLogin
    @RequestMapping("home")
    public SaResult home() {
        return SaResult.ok("访问成功,此处为登录后才能看到的信息");
    }

    // 登录接口  ---- http://localhost:8081/doLogin?name=zhang&pwd=123456
    @RequestMapping("doLogin")
    public SaResult doLogin(String name, String pwd) {
        // 此处仅作模拟示例,真实项目需要从数据库中查询数据进行比对
        if("zhang".equals(name) && "123456".equals(pwd)) {
            StpUtil.login(10001);
            return SaResult.ok("登录成功");
        }
        return SaResult.error("登录失败");
    }

}
/**
 * Sa-Token 注解鉴权示例 
 */
@RestController
@RequestMapping("/at-check/")
public class AtCheckController {

	/*
	 * 前提1:首先调用登录接口进行登录
	 * ---- http://localhost:8081/doLogin?name=zhang&pwd=123456
	 * 
	 * 前提2:项目在配置类中注册拦截器 SaInterceptor ,此拦截器将打开注解鉴权功能 
	 * 
	 * 前提3:项目实现了 StpInterface 接口,此接口会告诉框架指定账号拥有哪些权限码
	 * 
	 * 然后我们就可以使用以下示例中的代码进行注解鉴权了 
	 */
	
	// 权限校验   ---- http://localhost:8081/at-check/checkPermission
	// 只有具有 user.add 权限的账号才可以进入方法 
	@SaCheckPermission("user.add")
	@RequestMapping("checkPermission")
	public SaResult checkPermission() {
		// ... 
		return SaResult.ok();
	}

	// 角色校验   ---- http://localhost:8081/at-check/checkRole
	// 只有具有 super-admin 角色的账号才可以进入方法 
	@SaCheckRole("super-admin")
	@RequestMapping("checkRole")
	public SaResult checkRole() {
		// ... 
		return SaResult.ok();
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值