对于正在积极开发的软件,我们使用的是Spring Boot(具有Spring Security)和Keycloak适配器。
目标是:
@Public
注释的端点外,均需要有效的身份验证)(请参见代码段)(有效)一切正常,但是我在理解一些细节时遇到了一些问题:
KeycloakWebSecurityConfigurerAdapter
启用CSRF
保护。我认为只有这样做,它才能注册自己的Matcher以允许来自Keycloak的请求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();
}
}
答案 0 :(得分:2)
您可能会过多使用JWT令牌。以本文为例,https://blog.logrocket.com/jwt-authentication-best-practices/。尤其要看一下文章末尾有关将JWT作为会话令牌的参考。
在大多数情况下,对于Web应用程序UI,您都使用会话。使用哪种类型的令牌进行身份验证都没有关系。 Keycloak可以正确执行所有操作-它会返回httpOnly安全cookie进行会话管理,并在后端跟踪用户状态。为了更好地了解其工作原理,您可以在此处查看示例代码:examples
为了更好地分离无状态后端服务(微服务)和用户UI会话密钥斗篷documentation,建议使用2种不同的身份验证策略:RegisterSessionAuthenticationStrategy
用于会话,NullAuthenticatedSessionStrategy
用于仅承载服务