【问题标题】:Spring Security: provide access depending on service callSpring Security:根据服务调用提供访问
【发布时间】:2018-05-31 20:39:34
【问题描述】:

我有一个 Spring Boot 应用程序,它公开了受 Spring Security 保护的 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。类似anyRequest().access("@accessService.hasAccess(request.requestURI) && hasRole('USER')");

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


【解决方案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;
    }
}

【讨论】:

    【解决方案2】:

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

    类似下面的东西应该可以解决问题:

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

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

    【讨论】:

      猜你喜欢
      • 2014-04-24
      • 1970-01-01
      • 2019-07-23
      • 2015-07-14
      • 1970-01-01
      • 2019-10-24
      • 2021-09-04
      • 2015-04-17
      • 2013-01-17
      相关资源
      最近更新 更多