Spring Security详解(2)

Spring Security系列文章目录

关于Spring Security
Spring Security详解(1)
Spring Security详解(2)
Spring Security关于异常的处理


前言

提示:这里可以添加本文要记录的大概内容:

上篇文章介绍了如何使用Security开发自定义的登录流程,本文将介绍自定义登录流程的细节问题,如权限检查,部分代码仅供理解参考。


提示:以下是本篇文章正文内容,下面案例可供参考

一、处理登录成功的管理的权限列表

目前,存入到Security上下文中的认证信息(Authentication对象)并不包含有效的权限信息(目前是个假信息),为了后续能够判断用户的权限,需要:

  • 当认证(登录)成功后,取出管理员的权限,并将其存入到JWT数据中
  • 后续的请求中的JWT应该已经包含权限,则可以从JWT中解析出权限信息,并存入到认证信息(Authentication对象)中
  • 在操作过程中,应该先将权限列表转换成JSON再存入到JWT中,在解析JWT时,得到的权限信息也是一个JSON数据,需要将其转换成对象才能继续使用

关于JSON格式的转换,有许多工具都可以实现,例如:fastjson

<!-- fastjson:实现对象与JSON的相互转换 -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.75</version>
</dependency>

AdminServiceImpl处理登录时,当认证成功时,需要从认证结果中取出权限列表,转换成JSON字符串,并存入到JWT中:

// 原有其它代码
Collection<GrantedAuthority> authorities = loginUser.getAuthorities();
log.debug("认证结果中的权限列表:{}", authorities);
String authorityListString = JSON.toJSONString(authorities); // 【重要】将权限列表转换成JSON格式,用于存储到JWT中

// 生成JWT时的Claims相关代码
claims.put("authorities", authorityListString);
log.debug("生成JWT,向JWT中存入authorities:{}", authorityListString);

// 原有其它代码

然后,在JWT过滤器中,当成功的解析JWT时,应该获取权限列表的JSON字符串,并将其转换为认证对象要求的格式(Collection<? extends GrantedAuthority):

// 原有其它代码

Object authorityListString = claims.get("authorities");
log.debug("从JWT中解析得到authorities:{}", authorityListString);

// 准备Authentication对象,后续会将此对象封装到Security的上下文中
List<SimpleGrantedAuthority> authorities = JSON.parseArray(
        authorityListString.toString(), SimpleGrantedAuthority.class);
Authentication authentication = new UsernamePasswordAuthenticationToken(
        username, null, authorities);

// 原有其它代码

完成后,启动项目,正常登录,在服务器端的控制台可以看到相关日志,将权限存入到Security上下文的认证信息中包含权限列表。

二、使用Security框架检查权限

首先,需要在Security的配置类上开启全局的在方法上检查权限

// 其它原有注解
@EnableGlobalMethodSecurity(prePostEnabled = true) // 新增
public class SecurityConfiguration ... ...

然后,在控制器类中处理请求的方法上使用@PreAuthorize注解检查权限:

// 其它原有注解
@PreAuthorize("hasAuthority('/ams/admin/update&#
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值