Spring Security:根据服务调用提供访问权限

时间:2017-12-18 13:28:43

标签: java spring spring-security spring-security-oauth2 spring-rest

我有弹簧启动应用程序,它暴露受Spring安全保护的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端点?这样做的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

the reference guide中对此进行了解释。基本上,您需要使用access表达式而不是hasRole。然后,您可以编写强大的安全表达式

以下内容应该可以解决问题:

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

这限制了对具有角色ROLE_USER的用户的访问权限,并且该用户可以根据您自己的自定义逻辑进行访问。

答案 1 :(得分:1)

我认为一个很好的方法是使用@PreAuthorize 可以在此处找到一些文档:Expression-Based Access Control
您还可以添加自己的评估者类/方法,以根据您的特定需求进行自定义: @PreAuthorize("@customPermissionEvaluator.accessMethod(variable)")

示例类:

@Service(value = "customPermissionEvaluator")
public class CustomPermissionEvaluatorImpl implements CustomPermissionEvaluator {
    @Override
    public boolean accessMethod(int variable) {      
        if (variable == 1) {
            return true;
        }       
        return false;
    }
}