简体   繁体   English

MVC 测试 Spring 启动 Mocking Keycloak 令牌

[英]MVC Testing Spring Boot Mocking Keycloak Token

I'm trying to do a MVC-Unittest for my with keycloak secured API.我正在尝试使用 keycloak 保护 API 为我的 MVC 单元测试。

Using https://github.com/ch4mpy/spring-addons , and according to the example the test should work just fine.使用https://github.com/ch4mpy/spring-addons ,根据示例,测试应该可以正常工作。

test:测试:

    @RunWith(SpringRunner.class)
@WebMvcTest(controllers = StudentController.class)
@AutoConfigureMockMvc
@Import({ServletKeycloakAuthUnitTestingSupport.UnitTestConfig.class,
        KeycloakSecurityConfig.class})
public class StudentControllerTests {

    @Autowired
    private MockMvc mockMvc;

    @MockBean
    private StudentService service;

    @MockBean
    private StudentRepository repository;

    //TODO: Fix keycloak bug
    @Test
    @WithMockKeycloakAuth(
            authorities = { "USER", "AUTHORIZED_PERSONNEL" },
            id = @IdTokenClaims(sub = "42"),
            oidc = @OidcStandardClaims(
                    email = "test@testing.com",
                    emailVerified = true,
                    nickName = "TesterNickName",
                    preferredUsername = "testName"),
            accessToken = @KeycloakAccessToken(
                    realmAccess = @KeycloakAccess(roles = { "TESTER" }),
                    authorization = @KeycloakAuthorization(
                            permissions = @KeycloakPermission(rsid = "toto", rsname = "truc", scopes = "abracadabra"))),
            privateClaims = @ClaimSet(stringClaims = @StringClaim(name = "foo", value = "bar")))
    public void shouldTest() throws Exception {
        MvcResult result = this.mockMvc.perform(get("/students/test")).andReturn();
        assertEquals("abc", result.getResponse().getContentAsString());
    }
}

application.yml应用程序.yml

keycloak:
  realm: xxx
  auth-server-url: http://localhost:8081/auth
  ssl-required: external
  resource: client-interface
  use-resource-role-mappings: true
  credentials:
    secret: xxx
  bearer-only: true
  principal-attribute: preferred_username

I'm getting following stacktrace:我得到以下堆栈跟踪:

java.lang.NullPointerException
    at org.keycloak.adapters.KeycloakDeploymentBuilder.internalBuild(KeycloakDeploymentBuilder.java:57)
    at org.keycloak.adapters.KeycloakDeploymentBuilder.build(KeycloakDeploymentBuilder.java:202)
    at org.keycloak.adapters.springboot.KeycloakSpringBootConfigResolver.resolve(KeycloakSpringBootConfigResolver.java:39)
    at org.keycloak.adapters.springsecurity.config.KeycloakSpringConfigResolverWrapper.resolve(KeycloakSpringConfigResolverWrapper.java:40)
    at org.keycloak.adapters.AdapterDeploymentContext.resolveDeployment(AdapterDeploymentContext.java:89)
    at org.keycloak.adapters.springsecurity.filter.KeycloakPreAuthActionsFilter.doFilter(KeycloakPreAuthActionsFilter.java:82)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.header.HeaderWriterFilter.doHeadersAfter(HeaderWriterFilter.java:92)
    at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:77)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:119)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:105)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:334)
[...]

Any idea how to fix?知道如何解决吗?

Greetings, rosario问候,罗萨里奥

RTFM实时调频

According to the stack-trace, adapter config is null in KeycloakDeploymentBuilder .根据堆栈跟踪,适配器配置是 KeycloakDeploymentBuilder 中的KeycloakDeploymentBuilder After a few hops up, it appears that it is not injected in KeycloakSpringBootConfigResolver .经过几跳后,它似乎没有注入KeycloakSpringBootConfigResolver

As stated in my lib main readme : "Because of a regression from 9.0.2 to 12.0.0, you'll have to implement a work-around as shown in KeycloakSpringBootSampleApp"正如我的lib 主自述文件中所述:“由于从 9.0.2 到 12.0.0 的回归,您必须实施一种解决方法,如 KeycloakSpringBootSampleApp 中所示”

And in the sample linked there:在链接的示例中:

    // Work-around https://issues.redhat.com/browse/KEYCLOAK-14520 until keycloak 12.0.0
    @Configuration
    public class SpringBootKeycloakConfigResolver implements KeycloakConfigResolver {

        private KeycloakDeployment keycloakDeployment;

        private AdapterConfig adapterConfig;

        @Autowired
        public SpringBootKeycloakConfigResolver(AdapterConfig adapterConfig) {
            this.adapterConfig = adapterConfig;
        }

        @Override
        public KeycloakDeployment resolve(OIDCHttpFacade.Request request) {
            if (keycloakDeployment != null) {
                return keycloakDeployment;
            }

            keycloakDeployment = KeycloakDeploymentBuilder.build(adapterConfig);

            return keycloakDeployment;
        }
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 没有Mock的Spring MVC测试 - Spring MVC Testing without Mocking 测试 Spring 启动应用程序,实体模拟 - Testing Spring boot application, Entity mocking Mockito + Rest-Assured在Spring Boot REST MVC应用程序中未进行模拟(集成测试) - Mockito+ Rest-Assured not mocking in Spring Boot REST MVC application(Integration Testing) 在Spring MVC中模拟属性文件以进行Junit测试 - Mocking property file in spring mvc for Junit testing 使用 Spring MVC 和 mocking 服务测试 REST 服务 - Testing REST services with Spring MVC and mocking services Mocking 一个 OpenFeign 客户端,用于 spring 库中的单元测试,而不是用于 spring 引导应用程序 - Mocking an OpenFeign client for Unit Testing in a spring library and NOT for a spring boot application Spring 使用 Spring 安全和 Keycloak 启动,仅提供匿名身份验证令牌 - Spring Boot with Spring Security and Keycloak only providing Anonymous Authentication Token Spring 启动集成测试 - Mocking @Service 在应用程序上下文启动之前? - Spring Boot Integration Testing - Mocking @Service before Application Context Starts? 在 Spring Boot 服务层的单元测试中模拟原始字符串 - Mocking raw String in unit testing for Spring Boot service layer 使用带有 Spring 引导 + Keycloak 的不记名令牌时出现错误 500 - Error 500 while using bearer token with Spring boot + Keycloak
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM