java - Spring 安全: provide access depending on service call

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

我有 Spring Boot 应用程序,它公开受 Spring Security 保护的 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 Controller ,但我不确定这是否可行。

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

最佳答案

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

像下面这样的东西应该可以解决问题:

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

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

关于java - Spring 安全: provide access depending on service call,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47869562/

相关文章:

java - OncePerRequestFilter 无法设置不同于 404 的错误代码

spring-security - Aspectj 和 Spring Security 方面 - 建议执行顺序

javascript - 未存储 JSESSIONID cookie

Java 运算符 ||、-、/、+

java - 通过从基类派生继承静态字段的新 'instance'

java - 在 Java Web 应用程序中发送和接收文件

java - 如何在 JSP 页面中显示 Java 日历对象

java - 通用观察者 - 类型转换问题

java - 无法使用 spring cli 命令启动groovy应用程序

java - @WithMockUser 在集成测试中不起作用 - Spring boot