开发者社区> 问答> 正文

服务中的Spring Boot授权

我有一个Spring Boot应用程序,该应用程序使用Spring Security使用JWT对请求进行身份验证和授权。但是,某些请求只能由特定用户执行。例如:

GET /users/{id}/orders仅当{id}当前用户为或当前用户为时,才应返回订单列表ADMIN

PUT /orders/{id}仅当订单payer是当前用户时才应编辑订单

PUT /representation-requests/{id}/accept仅在当前用户是target制图表达请求的用户时才起作用

由于JWT的使用,我获取当前用户ID的方式是

String userId = ((DecodedJWT) SecurityContextHolder.getContext().getAuthentication().getDetails()).getSubject();

我已经在负责处理每个API调用的服务的各种方法中实现了这一点。我的问题是使用Spring Boot和Spring Security是否有更通用的方法?还是这不是标准用例?

我已经看过@PreAuthorize控制器中的注释,但是它不能满足我的需要,因为URL参数不足以检查嵌套实体。@PostAuthorize控制器中的代码似乎更接近,但是由于JWT的原因,我无法使其工作(并且在注释中执行长代码似乎也有些笨拙,不确定它是否比在服务本身中做的更好)。我感谢朝着正确方向的指针。

问题来源:Stack Overflow

展开
收起
montos 2020-03-21 22:19:55 966 0
1 条回答
写回答
取消 提交回答
  • 您必须花点时间尝试一下(我无法为您提供JWT的100%详细信息),但是您基本上可以使用SpEL来实现所需的功能。(我不确定为什么您认为@PostAuthorize可能更合适)

    无论是哪种方式,对于简单的检查(#表示方法参数)

    @PreAuthorize("principal?.id == #id")
    public List<Order> ordersForUsers(Integer id) {
        // do someting
    }
    

    或类似地,委派给自定义bean(@表示bean名称,对方法参数进行哈希处理,“ admin”您想要的角色,或其他任何参数,实际上)

    @PreAuthorize("@yourBean.hasPermission(principal, #id, 'admin')")
    public List<Order> ordersForUsers(Integer id) {
        // do someting
    }
    

    回答来源:Stack Overflow

    2020-03-21 22:21:02
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
云栖社区特邀专家徐雷Java Spring Boot开发实战系列课程(第20讲):经典面试题与阿里等名企内部招聘求职面试技巧 立即下载
微服务架构模式与原理Spring Cloud开发实战 立即下载
阿里特邀专家徐雷Java Spring Boot开发实战系列课程(第18讲):制作Java Docker镜像与推送到DockerHub和阿里云Docker仓库 立即下载