-1

我有春季启动应用程序,它公开了受春季安全保护的REST端点。春季安全:根据服务请求提供访问

我需要根据服务调用限制对某些路径的访问。比方说,我有一个服务是这样的:

@Service 
public class AccessService { 
    boolean hasAccess(String requestedPath) { 
     // some business logic here 
    } 
} 

该服务将检查用户的角色,一些企业经营状况,并返回truefalse

现在我需要将此服务调用集成到我的安全配置中。

到目前为止,我有配置是这样的:

@Override 
protected void configure(HttpSecurity http) throws Exception { 
     http 
       ... 
       .and().authorizeRequests() 
       .anyRequest().hasRole("USER"); 
} 

我看不出这里添加服务调用的方式(因为它是完全静态的)。

我试图:

目前我想重写我的AuthenticationProvider并与附加功能扩展它的。

另一种选择是将我的REST控制器从一个可以做某种授权的类中扩展出来,但我不确定它是否可行。

问题:如何根据服务方法调用保护REST端点?这样做的正确方法是什么?

+1

我建议阅读[参考指南](https://docs.spring.io/spring-security/site/docs/current/reference/html/el-access.html#el-access-web) 。类似于'anyRequest()。access(“@ accessService.hasAccess(request.requestURI)&& hasRole('USER')”);' –

回答

1

这在the reference guide解释。基本上你需要使用access表达式而不是hasRole。然后您可以编写强大的安全表达式。

类似下面应该做的伎俩:

anyRequest() 
    .access("@accessService.hasAccess(request.reques‌​tURI) && hasRole('USER')"); 

这限制与角色ROLE_USER并根据自己的自定义逻辑有机会访问用户。

1

我认为这是一个很好的方法是使用@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; 
    } 
}