Spring security 了解Keyclope适配器(Spring Security&;Spring Boot)会话要求

Spring security 了解Keyclope适配器(Spring Security&;Spring Boot)会话要求,spring-security,csrf,keycloak,websecurity,Spring Security,Csrf,Keycloak,Websecurity,对于处于活动开发中的软件,我们使用Spring引导(带Spring Security)和KeyClope适配器 目标是: 需要对所有端点进行有效的身份验证,但使用@Public注释的端点除外(请参见代码片段)(此功能有效) 身份验证必须通过OAuth进行-客户端直接从KeyDope获取令牌,Spring Security+KeyDope适配器确保令牌有效 可选地,还支持基本身份验证(可以将KeyClope适配器配置为执行登录,并使其在代码的其余部分看起来像常规令牌身份验证)(这同样有效) 目

对于处于活动开发中的软件,我们使用Spring引导(带Spring Security)和KeyClope适配器

目标是:

  • 需要对所有端点进行有效的身份验证,但使用
    @Public
    注释的端点除外(请参见代码片段)(此功能有效)
  • 身份验证必须通过OAuth进行-客户端直接从KeyDope获取令牌,Spring Security+KeyDope适配器确保令牌有效
  • 可选地,还支持基本身份验证(可以将KeyClope适配器配置为执行登录,并使其在代码的其余部分看起来像常规令牌身份验证)(这同样有效)
目前一切正常,但我在理解一些细节时遇到一些问题:

  • keydeposetwebsecurityconfigureradapter
    启用
    CSRF
    保护。我认为这样做只是为了让它能够注册自己的匹配器,以允许来自KeyClope的请求
  • 它支持会话管理,并需要一些相应的bean
  • 即使使用令牌身份验证发出请求,也会返回
    JSESSIONID
    cookie
据我了解:

  • 由于使用了无状态令牌身份验证,因此不需要会话(那么为什么要启用
    keydepowebsecurityconfigureradapter
    )。这是否仅适用于
    基本身份验证
    部分
  • 由于会话是启用的,
    CSRF
    保护确实是需要的-但我不希望首先使用会话,然后API就不需要
    CSRF
    保护,对吗
  • 即使我在
    super.configure(http)
    调用后设置了
    http.sessionManagement().disable()
    ,设置了
    JSESSIONID
    cookie(这是从哪里来的?)
正如代码片段中所述,
SessionAuthenticationStrategy
一次都没有设置为null,因为我们使用了keydape的
Authorization
部分,并且应用程序是
服务帐户管理器
(从而管理这些资源记录)

如果有人能把事情弄清楚就好了。提前谢谢

@keydepose配置
公共类WebSecurity配置扩展了KeyDopperWebSecurity配置适配器{
@注入私有RequestMappingHandlerMappingRequestMappingHandlerMapping;
@凌驾
受保护的void configure(最终HttpSecurity http)引发异常{
super.configure(http);
http
.授权请求()
.requestMatchers(新PublicHandlerMethodMatcher(requestMappingHandlerMapping))
.permitAll()
.anyRequest()
.authenticated();
}
//~~~~~~~~~~~~~~钥匙斗篷~~~~~~~~~~
@凌驾
@ConditionalOnMissingBean(HttpSessionManager.class)
@受Bean保护的HttpSessionManager HttpSessionManager(){
返回新的HttpSessionManager();
}
/**
*{@link NullAuthenticatedSessionStrategy}未使用,因为我们启动了登录
*从我们的应用程序,这将不可能与{@code bearer only}
*客户端(建议使用空策略)。
*/
@凌驾
@受Bean保护的SessionAuthenticationStrategy SessionAuthenticationStrategy(){
返回新的RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}
/**
*所需的HTTP会话{@link ApplicationEvent}发布服务器
*{@link#sessionAuthenticationStrategy()}的{@link SessionRegistryImpl}
*正常工作。
*/
@Bean公共HttpSessionEventPublisher HttpSessionEventPublisher(){
返回新的HttpSessionEventPublisher();
}
@凌驾
@Bean public KeyDoppeAuthenticationProvider KeyDoppeAuthenticationProvider(){
返回super.keydapertificationprovider();
}
}

您可能会过度使用JWT令牌。以本文为例。特别是在文章末尾关于JWT作为会话令牌的引用

对于web应用程序UI,在大多数情况下,您都在使用会话。使用什么类型的令牌进行身份验证并不重要。KeyClope做的每件事都是正确的——它返回用于会话管理的httpOnly安全cookie,并在后端跟踪用户状态。为了更好地理解其工作原理,您可以查看以下示例代码:

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