如何在SpringBoot的AccessDecisionVoter中访问请求体?

时间:2017-08-16 07:22:42

标签: spring-boot permissions spring-security-oauth2

因此我们有一个授权服务器,我们使用它来创建OAuth2访问令牌。所有子系统都验证访问令牌,并可以检查请求路径的权限,但是,在其中一个子系统中,我们需要查看请求正文并提取“ID”。检查用户是否具有提交请求的适当权限。请求消息是JSON格式,这是一个带有客户端提供的id的POST请求。

请求中的id是进程ID,某些用户可能没有对某些进程的权限,因此我们需要id来验证。

因此,在AccessDecisionVoter中,我们只能获取请求URI但我无法获取HttpServletRequest来阅读该消息。 (注意:我们有一个Request包装器,允许我们多次读取请求体)

我试图自动连线HttpServletRequest,没有运气。有一个错误,没有线程绑定到请求

我也在考虑实现UserDetailService但是再没有运气,因为Spring引导没有调用它。请记住,我们使用的是自定义AuthorizationServerTokenServices,它位于公共库中。

如何在AccessDecisionVoter

中获取Http servlet请求或请求正文

1 个答案:

答案 0 :(得分:0)

您应该能够实现AccessDecisionVoter<FilterInvocation>,以便获取请求。这不起作用:

public class MyAccessDecisionVoter implements AccessDecisionVoter<FilterInvocation> {
    @Override
    public boolean supports(ConfigAttribute attribute) {
        return false;
    }

    @Override
    public boolean supports(Class<?> clazz) {
        return true;
    }

    @Override
    public int vote(Authentication authentication, FilterInvocation fi, Collection<ConfigAttribute> attributes) {
        int result = ACCESS_ABSTAIN;
        fi.getRequest() // this is the request
        // decide the outcome and set result

        return result;
    }
}