Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 服务中的Spring启动授权_Java_Spring_Spring Boot_Spring Security - Fatal编程技术网

Java 服务中的Spring启动授权

Java 服务中的Spring启动授权,java,spring,spring-boot,spring-security,Java,Spring,Spring Boot,Spring Security,我有一个Spring引导应用程序,它使用Spring安全性来使用JWT对请求进行身份验证和授权。但是,某些请求只能由特定用户执行。例如: GET/users/{id}/orders仅当{id}是当前用户或当前用户是ADMIN PUT/orders/{id}仅当其付款人是当前用户时才应编辑订单 PUT/representation requests/{id}/accept应仅在当前用户是表示请求的目标时起作用 由于JWTs的使用,我获取当前用户ID的方式是 String userId=((Deco

我有一个Spring引导应用程序,它使用Spring安全性来使用JWT对请求进行身份验证和授权。但是,某些请求只能由特定用户执行。例如:

GET/users/{id}/orders
仅当
{id}
是当前用户或当前用户是
ADMIN

PUT/orders/{id}
仅当其
付款人
是当前用户时才应编辑订单

PUT/representation requests/{id}/accept
应仅在当前用户是表示请求的
目标时起作用

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

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

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


我已经查看了控制器中的
@PreAuthorize
注释,但它不符合我的需要,因为URL参数不足以检查嵌套实体<控制器中的code>@PostAuthorize
似乎更接近,但由于JWT,我无法让它工作(而且在注释中编写长代码似乎有点笨拙,不确定这是否比在服务本身中更好)。我很欣赏一个指向正确方向的指针。

你必须稍微玩弄一下(我不能给你关于JWT的100%细节),但你基本上可以使用SpEL来实现你想要的。(但我不确定你为什么认为@PostAuthorize更合适)

对于简单检查(#表示一个方法参数)

@预授权(“主体?.id==#id”)
公共列表排序器(整数id){
//做点什么
}
或者像这样,委托给一个定制bean(@表示一个bean名称,散列方法param,'admin'您想要的角色,或者任何其他参数,真的)

@PreAuthorize(@yourBean.hasphorimission(主体,#id,'admin'))
公共列表排序器(整数id){
//做点什么
}

谢谢,我只是觉得
@PostAuthorize
更合适,因为我不知道您可以在
@PreAuthorize
中使用自定义bean。
@PreAuthorize("principal?.id == #id")
public List<Order> ordersForUsers(Integer id) {
    // do someting
}
@PreAuthorize("@yourBean.hasPermission(principal, #id, 'admin')")
public List<Order> ordersForUsers(Integer id) {
    // do someting
}