Spring Security 登录后Spring“凭据无效”的Keycloak

ckocjqey  于 2023-01-02  发布在  Spring
关注(0)|答案(5)|浏览(261)

我在使用Keycloak单机版设置一个简单的Spring Web关+oauth2客户端时运气不佳。它的keycloack部分工作正常。Wireshark显示令牌正确生成。

网关安全配置如下。我仍然不确定是否需要permitAll()登录回调url。一些指南建议应该这样做,其他指南则没有。我怀疑oauth提供程序在幕后管理这部分。尽管如此,无论是否为"/login/* "路径使用permitAll,结果都是一样的。

@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {
    @Bean
    public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        http.authorizeExchange(e -> e.anyExchange().authenticated());
        http.oauth2Login(Customizer.withDefaults());
        http.csrf().disable();
        return http.build();
    }
}

登录后,重定向到https://localhost:9000/login似乎不正确,应重试原始URL,例如https://localhost:9000/test-service/v1/listall/
编辑
为了排除任何错误的配置,甚至尝试了一个最简单的网关和api资源(未认证),并在keyclock中设置了最简单的relam,结果没有改变:(有很多文章都在做完全相同的事情。
∮ ∮ ∮ ∮ ∮一卡一卡一
有什么建议吗?
多谢

piwo6bdm

piwo6bdm1#

甚至我已经完成了包括“创建客户端”、“创建作用域”和用这个作用域创建“用户”在内的所有配置,我又遇到了这个问题。
唯一对我有效的解决方案是将scope :openid添加到application.yaml
您可以从这里引用application.yaml Security OAuth配置:

security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: https://${keycloak.base.url}/auth/realms/${realm}
      client:
        registration:
          gateway:
            provider: keycloak
            client-id: ${client id}
            client-secret:${client secret}
            scope: openid
        provider:
          keycloak:
            user-name-attribute: preferred_username
            issuer-uri: https://${keycloak.base.url}/auth/realms/${realm}
e4eetjau

e4eetjau2#

根据官方文档(可在https://www.keycloak.org/docs/latest/securing_apps/#_spring_security_adapter上找到),您应该使用

@KeycloakConfiguration
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter
o7jaxewo

o7jaxewo3#

我发现它是一个错误的用户名属性。正确的值是

user-name-attribute: preferred_username

出于某种原因,我将它设置为preferred_name,如果spring oauth只写实际的错误而不是一般的invalid_grant,那么将保存大量的调试时间。

jvlzgdj9

jvlzgdj94#

首先,对于任何对Spring Security进行故障排除的人,我建议通过在www.example.com或application.yml文件中设置日志级别来启用调试日志记录application.properties。
application.properties 格式:

logging.level.org.springframework.security=DEBUG

应用程序.yml格式:

logging:
    level:
        org:
            springframework:
                security: DEBUG

我在使用OAuth2沿着Spring会话时也遇到了类似的问题。即使在使用Keycloak成功进行身份验证后,每当我的Spring会话过期时,我都会收到这个登录错误。
我不能容忍混淆身份验证流,但是我可以通过在ServerHttpSecurity上设置自己的身份验证入口点来解决这个问题:

http.exceptionHandling().authenticationEntryPoint(new RedirectServerAuthenticationEntryPoint("/oauth2/authorization/keycloak"));

然后,我必须在我的控制器中处理任何对“/login”页面的请求。对我来说,我只需要重定向到我的默认登录页面来处理根请求:

@Controller
@RequestMapping("/")
public class RootController {
    
    @GetMapping({"", "login"})
    public Mono<String> index() {
        return Mono.just("redirect:/myLandingPage");
    }
}
hzbexzde

hzbexzde5#

不知何故,在我的www.example.com中添加“scope=openid”applications.properties对我来说很好

spring.security.oauth2.client.registration.spring-cloud-client.scope=openid

相关问题