Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/400.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring Security:根据服务调用提供访问权限_Java_Spring_Spring Security_Spring Security Oauth2_Spring Rest - Fatal编程技术网

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

Java Spring Security:根据服务调用提供访问权限,java,spring,spring-security,spring-security-oauth2,spring-rest,Java,Spring,Spring Security,Spring Security Oauth2,Spring Rest,我有一个SpringBoot应用程序,它公开了受SpringSecurity保护的REST端点 我需要根据服务调用限制对某些路径的访问。假设我有这样的服务: @Service public class AccessService { boolean hasAccess(String requestedPath) { // some business logic here } } @Override protected void configure(HttpSec

我有一个SpringBoot应用程序,它公开了受SpringSecurity保护的REST端点

我需要根据服务调用限制对某些路径的访问。假设我有这样的服务:

@Service
public class AccessService {
    boolean hasAccess(String requestedPath) {
        // some business logic here
    }
}
@Override
protected void configure(HttpSecurity http) throws Exception {
        http
                ...
                .and().authorizeRequests()
                .anyRequest().hasRole("USER");
}
该服务将检查用户角色和一些业务条件,并返回
true
false

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

到目前为止,我有如下配置:

@Service
public class AccessService {
    boolean hasAccess(String requestedPath) {
        // some business logic here
    }
}
@Override
protected void configure(HttpSecurity http) throws Exception {
        http
                ...
                .and().authorizeRequests()
                .anyRequest().hasRole("USER");
}
我看不到在这里添加服务调用的方法(因为它是完全静态的)

我在尝试什么:

目前,我正在考虑覆盖我的
AuthenticationProvider
,并使用附加功能对其进行扩展

另一个选择是从一个类扩展我的REST控制器,该类将执行某种授权,但我不确定这是否可行


问题:如何基于服务方法调用保护REST端点?正确的方法是什么?

我认为一个好方法是使用
@PreAuthorize
可以在此处找到一些文档:。
您还可以添加自己的evaluator类/方法,以根据您的特定需要进行自定义:
@PreAuthorize(@customPermissionEvaluator.accessMethod(变量)”)

示例类:

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

我认为一个好方法是使用
@PreAuthorize
可以在此处找到一些文档:。
您还可以添加自己的evaluator类/方法,以根据您的特定需要进行自定义:
@PreAuthorize(@customPermissionEvaluator.accessMethod(变量)”)

示例类:

@Service(value = "customPermissionEvaluator")
public class CustomPermissionEvaluatorImpl implements CustomPermissionEvaluator {
    @Override
    public boolean accessMethod(int variable) {      
        if (variable == 1) {
            return true;
        }       
        return false;
    }
}
这一点在本文中进行了解释。基本上,您需要使用
access
表达式,而不是
hasRole
。然后,您可以编写功能强大的安全表达式

类似于以下内容的内容应该可以做到这一点:

anyRequest()
    .access("@accessService.hasAccess(request.reques‌​tURI) && hasRole('USER')");
这将限制对具有角色
role\u user
的用户的访问,这些用户可以根据您自己的自定义逻辑进行访问

这在中进行了解释。基本上,您需要使用
access
表达式,而不是
hasRole
。然后,您可以编写功能强大的安全表达式

类似于以下内容的内容应该可以做到这一点:

anyRequest()
    .access("@accessService.hasAccess(request.reques‌​tURI) && hasRole('USER')");
这将限制对具有角色
role\u user
的用户的访问,这些用户可以根据您自己的自定义逻辑进行访问

我建议读一读。类似于
anyRequest().access(@accessService.hasAccess(request.requestURI)和&hasRole('USER')我建议读一读。类似于
anyRequest().access(@accessService.hasAccess(request.requestURI)和&hasRole('USER')