java - Spring启动测试: User protected security controller on testing

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

这里有我的 Controller 方法:

@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 Access is denied

编辑

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

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

除此之外,我现在无法更改此代码,我想知道如何使用 @WithMockUser 向主体提供 “String user”

最佳答案

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

@PreAuthorize("principal.username == '" + EspaiDocConstants.BO_COMPONENT_APP + "'")

关于java - Spring启动测试: User protected security controller on testing,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54421692/

相关文章:

java - 如何创建一个总体 if 语句?如, "if this happens at any point in the program..."

java - @MessageGateway 上设置的默认 header 未显示在消息中

java - Logback 不会在 Spring Boot 的 @ExceptionHandler 中记录 ConstraintViolationException

java - Angular 元素定位

java - Android 中 Canny 边缘检测器的快速自适应阈值

java - 一对多映射关系未正确保存数据

java - 尝试设置数据库连接的初始池大小(spring-boot)

grails - 在 Grails 中用自己的方法扩展 SpEL?

java - 来自多个身份验证服务器的 OAuth2/OIDC 客户端授权的额外身份验证步骤

java - Spring Security对用户进行身份验证时如何在 session 中管理自定义用户对象?