Java Spring Security:根据服务调用提供访问权限
我有一个SpringBoot应用程序,它公开了受SpringSecurity保护的REST端点 我需要根据服务调用限制对某些路径的访问。假设我有这样的服务:Java Spring Security:根据服务调用提供访问权限,java,spring,spring-security,spring-security-oauth2,spring-rest,Java,Spring,Spring Security,Spring Security Oauth2,Spring Rest,我有一个SpringBoot应用程序,它公开了受SpringSecurity保护的REST端点 我需要根据服务调用限制对某些路径的访问。假设我有这样的服务: @Service public class AccessService { boolean hasAccess(String requestedPath) { // some business logic here } } @Override protected void configure(HttpSec
@Service
public class AccessService {
boolean hasAccess(String requestedPath) {
// some business logic here
}
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
...
.and().authorizeRequests()
.anyRequest().hasRole("USER");
}
该服务将检查用户角色和一些业务条件,并返回true
或false
现在我需要将此服务调用集成到我的安全配置中
到目前为止,我有如下配置:
@Service
public class AccessService {
boolean hasAccess(String requestedPath) {
// some business logic here
}
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
...
.and().authorizeRequests()
.anyRequest().hasRole("USER");
}
我看不到在这里添加服务调用的方法(因为它是完全静态的)
我在尝试什么:
目前,我正在考虑覆盖我的AuthenticationProvider
,并使用附加功能对其进行扩展
另一个选择是从一个类扩展我的REST控制器,该类将执行某种授权,但我不确定这是否可行
问题:如何基于服务方法调用保护REST端点?正确的方法是什么?我认为一个好方法是使用
@PreAuthorize
可以在此处找到一些文档:。
您还可以添加自己的evaluator类/方法,以根据您的特定需要进行自定义:
@PreAuthorize(@customPermissionEvaluator.accessMethod(变量)”)
示例类:
@Service(value = "customPermissionEvaluator")
public class CustomPermissionEvaluatorImpl implements CustomPermissionEvaluator {
@Override
public boolean accessMethod(int variable) {
if (variable == 1) {
return true;
}
return false;
}
}
我认为一个好方法是使用
@PreAuthorize
可以在此处找到一些文档:。
您还可以添加自己的evaluator类/方法,以根据您的特定需要进行自定义:
@PreAuthorize(@customPermissionEvaluator.accessMethod(变量)”)
示例类:
@Service(value = "customPermissionEvaluator")
public class CustomPermissionEvaluatorImpl implements CustomPermissionEvaluator {
@Override
public boolean accessMethod(int variable) {
if (variable == 1) {
return true;
}
return false;
}
}
这一点在本文中进行了解释。基本上,您需要使用access
表达式,而不是hasRole
。然后,您可以编写功能强大的安全表达式
类似于以下内容的内容应该可以做到这一点:
anyRequest()
.access("@accessService.hasAccess(request.requestURI) && hasRole('USER')");
这将限制对具有角色role\u user
的用户的访问,这些用户可以根据您自己的自定义逻辑进行访问 这在中进行了解释。基本上,您需要使用access
表达式,而不是hasRole
。然后,您可以编写功能强大的安全表达式
类似于以下内容的内容应该可以做到这一点:
anyRequest()
.access("@accessService.hasAccess(request.requestURI) && hasRole('USER')");
这将限制对具有角色role\u user
的用户的访问,这些用户可以根据您自己的自定义逻辑进行访问 我建议读一读。类似于anyRequest().access(@accessService.hasAccess(request.requestURI)和&hasRole('USER')代码>我建议读一读。类似于anyRequest().access(@accessService.hasAccess(request.requestURI)和&hasRole('USER')代码>