了解Keycloak适配器(Spring-Security和Spring Boot)会话要求

时间:2019-07-11 09:30:45

标签: spring-security csrf keycloak websecurity

对于正在积极开发的软件,我们使用的是Spring Boot(具有Spring Security)和Keycloak适配器。

目标是:

  • 要求所有端点(除用@Public注释的端点外,均需要有效的身份验证)(请参见代码段)(有效)
  • 身份验证必须通过OAuth-客户端直接从Keycloak获取令牌,Spring Security + Keycloak适配器确保其有效
  • (可选)还支持基本身份验证(Keycloak适配器可以配置为执行登录,并使其在其余代码中看起来像常规令牌身份验证一样)(同样有效)

一切正常,但是我在理解一些细节时遇到了一些问题:

  • KeycloakWebSecurityConfigurerAdapter启用CSRF保护。我认为只有这样做,它才能注册自己的Matcher以允许来自Keycloak的请求
  • 它启用会话管理,并需要一些相应的bean
  • 即使请求是使用令牌身份验证进行的,也会返回JSESSIONID cookie

根据我的理解:

    由于使用了无状态令牌身份验证,因此不需要
  • 会话(为什么KeycloakWebSecurityConfigurerAdapter启用它)。这仅用于BASIC Auth部分吗?
  • 由于启用了会话,因此确实需要CSRF保护-但是我不希望会话首先出现,然后API不需要CSRF保护,对吧?
  • 即使我在http.sessionManagement().disable()调用之后设置了super.configure(http),也设置了JSESSIONID cookie(所以这是哪里来的?)

如代码片段所述,SessionAuthenticationStrategy不会一次设置为null,因为我们使用了Keycloak的Authorization部分,并且应用程序是Service Account Manager(因此管理这些资源记录) )。

如果有人可以清除所有问题,那就太好了。预先感谢!

@KeycloakConfiguration
public class WebSecurityConfiguration extends KeycloakWebSecurityConfigurerAdapter {

    @Inject private RequestMappingHandlerMapping requestMappingHandlerMapping;

    @Override
    protected void configure(final HttpSecurity http) throws Exception {
        super.configure(http);
        http
            .authorizeRequests()
                .requestMatchers(new PublicHandlerMethodMatcher(requestMappingHandlerMapping))
                    .permitAll()
                .anyRequest()
                    .authenticated();
    }

    // ~~~~~~~~~~ Keycloak ~~~~~~~~~~

    @Override
    @ConditionalOnMissingBean(HttpSessionManager.class)
    @Bean protected HttpSessionManager httpSessionManager() {
        return new HttpSessionManager();
    }

    /**
     * {@link NullAuthenticatedSessionStrategy} is not used since we initiate logins
     * from our application and this would not be possible with {@code bearer-only}
     * clients (for which the null strategy is recommended). 
     */
    @Override
    @Bean protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

    /**
     * HTTP session {@link ApplicationEvent} publisher needed for the
     * {@link SessionRegistryImpl} of {@link #sessionAuthenticationStrategy()}
     * to work properly.
     */
    @Bean public HttpSessionEventPublisher httpSessionEventPublisher() {
        return new HttpSessionEventPublisher();
    }

    @Override
    @Bean public KeycloakAuthenticationProvider keycloakAuthenticationProvider() {
        return super.keycloakAuthenticationProvider();
    }

}

1 个答案:

答案 0 :(得分:2)

您可能会过多使用JWT令牌。以本文为例,https://blog.logrocket.com/jwt-authentication-best-practices/。尤其要看一下文章末尾有关将JWT作为会话令牌的参考。

在大多数情况下,对于Web应用程序UI,您都使用会话。使用哪种类型的令牌进行身份验证都没有关系。 Keycloak可以正确执行所有操作-它会返回httpOnly安全cookie进行会话管理,并在后端跟踪用户状态。为了更好地了解其工作原理,您可以在此处查看示例代码:examples

为了更好地分离无状态后端服务(微服务)和用户UI会话密钥斗篷documentation,建议使用2种不同的身份验证策略:RegisterSessionAuthenticationStrategy用于会话,NullAuthenticatedSessionStrategy用于仅承载服务