了解Keycloak适配器(Spring安全性和Spring Boot)会话要求

问题描述 投票:1回答:1

对于积极开发中的软件,我们使用的是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(所以这是哪里来的?)>
  • 如代码片段所述,由于我们使用Keycloak的SessionAuthenticationStrategy部分并且应用程序为Authorization(因此管理这些资源记录),因此Service Account Manager不会一次设置为null。

如果有人可以清除所有内容,那将很棒。预先感谢!

@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();
    }

}

对于积极开发中的软件,我们正在使用Spring Boot(具有Spring Security)和Keycloak适配器。目标是:对除注释的那些端点以外的所有端点都要求有效的身份验证...

spring-security csrf keycloak websecurity
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.