春季启动测试:测试中受用户保护的安全控制器

时间:2019-01-29 13:01:26

标签: java spring-boot spring-security spring-test spring-security-test

这里有我的控制器方法:

@PreAuthorize("principal == '" + EspaiDocConstants.BO_COMPONENT_APP + "'")
public void ingestAudits() {
    // Do something
}

如您所见,它受@PreAuthorize("principal == '" + EspaiDocConstants.BO_COMPONENT_APP + "'")

保护

这是我的测试代码:

@WithMockUser(username=EspaiDocConstants.BO_COMPONENT_APP)
@Test
public void test() throws IOException, NoSuchAlgorithmException {
    this.controller.ingestAudits();
}

尽管如此,我收到以下异常消息:

  

DigestAuditsTest.test:91»AccessDenied访问被拒绝

编辑

为了填充主体,我使用了自定义过滤器:

public class JWTAuthorizationFilter extends BasicAuthenticationFilter {
    @Override
    protected void doFilterInternal(
        HttpServletRequest req,
        HttpServletResponse res,
        FilterChain chain
    ) throws IOException, ServletException {
        String user = Jwts.parser().setSigningKey(SECRET)
            .parseClaimsJws(token.replace(TOKEN_PREFIX, ""))
            .getBody().getSubject();

        SecurityContextHolder.getContext()
            .setAuthentication(
                new UsernamePasswordAuthenticationToken(user, null)
            );

        chain.doFilter(req, res);
    }
}

因此,principal是包含用户的String

除此之外,我现在无法更改此代码,并且我想知道如何使用"String user"向委托人提供@WithMockUser

1 个答案:

答案 0 :(得分:0)

您应仅使用“ ==”验证用户名,而不验证整个主体对象。

  

@PreAuthorize(“主体。用户名 =='” + EspaiDocConstants.BO_COMPONENT_APP +   “'”)

相关问题