Spring 安全性:根据服务调用提供访问权限
Spring Security: provide access depending on service call
我有 spring 启动应用程序,它公开了受 spring 安全保护的 REST 端点。
我需要根据服务调用限制对某些路径的访问。 假设我有这样的服务:
@Service
public class AccessService {
boolean hasAccess(String requestedPath) {
// some business logic here
}
}
该服务将检查用户角色、一些业务条件和 return true
或 false
。
现在我需要将此服务调用集成到我的安全配置中。
到目前为止我的配置是这样的:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
...
.and().authorizeRequests()
.anyRequest().hasRole("USER");
}
我看不到在此处添加服务调用的方法(因为它是完全静态的)。
我在尝试什么:
目前我正在考虑覆盖我的 AuthenticationProvider
并使用附加功能对其进行扩展。
另一种选择是从 class 扩展我的 REST 控制器,这会进行某种授权,但我不确定是否可行。
问题:如何保护基于服务方法调用的 REST 端点?这样做的正确方法是什么?
我认为一个好的方法是使用 @PreAuthorize
可以在此处找到一些文档:Expression-Based Access Control。
您还可以添加自己的评估器 class/methods 以根据您的特定需求进行自定义:
@PreAuthorize("@customPermissionEvaluator.accessMethod(variable)")
示例class:
@Service(value = "customPermissionEvaluator")
public class CustomPermissionEvaluatorImpl implements CustomPermissionEvaluator {
@Override
public boolean accessMethod(int variable) {
if (variable == 1) {
return true;
}
return false;
}
}
这在 the reference guide 中有解释。基本上您需要使用 access
表达式而不是 hasRole
。然后您可以编写强大的安全表达式。
像下面这样的东西应该可以解决问题:
anyRequest()
.access("@accessService.hasAccess(request.requestURI) && hasRole('USER')");
这会限制具有 ROLE_USER
角色的用户的访问权限,并且可以根据您自己的自定义逻辑进行访问。
我有 spring 启动应用程序,它公开了受 spring 安全保护的 REST 端点。
我需要根据服务调用限制对某些路径的访问。 假设我有这样的服务:
@Service
public class AccessService {
boolean hasAccess(String requestedPath) {
// some business logic here
}
}
该服务将检查用户角色、一些业务条件和 return true
或 false
。
现在我需要将此服务调用集成到我的安全配置中。
到目前为止我的配置是这样的:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
...
.and().authorizeRequests()
.anyRequest().hasRole("USER");
}
我看不到在此处添加服务调用的方法(因为它是完全静态的)。
我在尝试什么:
目前我正在考虑覆盖我的 AuthenticationProvider
并使用附加功能对其进行扩展。
另一种选择是从 class 扩展我的 REST 控制器,这会进行某种授权,但我不确定是否可行。
问题:如何保护基于服务方法调用的 REST 端点?这样做的正确方法是什么?
我认为一个好的方法是使用 @PreAuthorize
可以在此处找到一些文档:Expression-Based Access Control。
您还可以添加自己的评估器 class/methods 以根据您的特定需求进行自定义:
@PreAuthorize("@customPermissionEvaluator.accessMethod(variable)")
示例class:
@Service(value = "customPermissionEvaluator")
public class CustomPermissionEvaluatorImpl implements CustomPermissionEvaluator {
@Override
public boolean accessMethod(int variable) {
if (variable == 1) {
return true;
}
return false;
}
}
这在 the reference guide 中有解释。基本上您需要使用 access
表达式而不是 hasRole
。然后您可以编写强大的安全表达式。
像下面这样的东西应该可以解决问题:
anyRequest()
.access("@accessService.hasAccess(request.requestURI) && hasRole('USER')");
这会限制具有 ROLE_USER
角色的用户的访问权限,并且可以根据您自己的自定义逻辑进行访问。