春季安全:根据服务请求提供访问
我有春季启动应用程序,它公开了受春季安全保护的REST端点。春季安全:根据服务请求提供访问
我需要根据服务调用限制对某些路径的访问。比方说,我有一个服务是这样的:
@Service public class AccessService {
boolean hasAccess(String requestedPath) {
// some business logic here
}
}
该服务将检查用户的角色,一些企业经营状况,并返回true
或false
。
现在我需要将此服务调用集成到我的安全配置中。
到目前为止,我有配置是这样的:
@Override protected void configure(HttpSecurity http) throws Exception {
http
...
.and().authorizeRequests()
.anyRequest().hasRole("USER");
}
我看不出这里添加服务调用的方式(因为它是完全静态的)。
我试图:
目前我想重写我的AuthenticationProvider
并与附加功能扩展它的。
另一种选择是将我的REST控制器从一个可以做某种授权的类中扩展出来,但我不确定它是否可行。
问题:如何根据服务方法调用保护REST端点?这样做的正确方法是什么?
回答:
这在the reference guide解释。基本上你需要使用access
表达式而不是hasRole
。然后您可以编写强大的安全表达式。
类似下面应该做的伎俩:
anyRequest() .access("@accessService.hasAccess(request.requestURI) && hasRole('USER')");
这限制与角色ROLE_USER
并根据自己的自定义逻辑有机会访问用户。
回答:
我认为这是一个很好的方法是使用@PreAuthorize
一些文件可以在这里找到:Expression-Based Access Control。
你还可以添加自己的评估类/方法来定制您的特定需求: @PreAuthorize("@customPermissionEvaluator.accessMethod(variable)")
Example类:
@Service(value = "customPermissionEvaluator") public class CustomPermissionEvaluatorImpl implements CustomPermissionEvaluator {
@Override
public boolean accessMethod(int variable) {
if (variable == 1) {
return true;
}
return false;
}
}
以上是 春季安全:根据服务请求提供访问 的全部内容, 来源链接: utcz.com/qa/263718.html