如何使用Spring Security将Keycloak集成到简单的Sping Boot 后端?

k97glaaz  于 2023-06-29  发布在  Spring
关注(0)|答案(1)|浏览(146)

我目前正在尝试为一个简单的Sping Boot 后端应用程序实现安全性。为此,我打算将Keycloak与Spring Security结合使用。在尝试了几十个教程设置(只是一个基本的过滤器/ SecurityConfig)之后,我对为什么SecurityFilterChain不能工作一无所知。
作为参考-以下是我的依赖项:

  • org.springframework. Boot :spring-boot-starter:3.1.0
  • org.springframework. Boot :spring-boot-starter-web:3.1.0
  • Boot :spring-boot-starter-oauth2-client:3.1.0
  • Boot :spring-boot-starter-security:3.1.0
  • Boot :spring-boot-starter-oauth2-resource-server:3.1.0
  • org.projectlombok:lombok:1.18.26
  • org.springframework. Boot :spring-boot-starter-test:3.1.0

Sping Boot 3.1.0!由于网上的材料是过去两年的,我也尝试了不同的版本通过(eidogg)。<spring-security.version>6.1.1</spring-security.version>等)
至于我的application.properties,我添加了最基本的设置:

spring.security.oauth2.client.registration.keycloak.client-id=[client-id]
spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.keycloak.scope=openid
spring.security.oauth2.client.provider.keycloak.issuer-uri=http://localhost:8080/realms/dev
spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_username

就这样!现在来看看我经历过的不同方法 * 不成功 *:
1. Tutorial from Baeldung
在那里,它指定了用于@Bean的SecurityConfig,返回SecurityFilterChain

@Bean
 public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
     http.authorizeRequests()
             .antMatchers("/customers*")
             .hasRole("USER")
             .anyRequest()
             .permitAll();
     http.oauth2Login()
             .and()
             .logout()
             .addLogoutHandler(keycloakLogoutHandler)
             .logoutSuccessUrl("/");
     http.oauth2ResourceServer(OAuth2ResourceServerConfigurer::jwt);
     return http.build();
 }

...显然,'authorizeRequests()'已经过时了。同样适用于'oauth2Login()'(甚至标记为删除)!

2. GitHub Issue #10187讨论

在前面提到的问题中,一个深入的讨论爆发了,许多成员分享了他们的代码片段。这是一个非常新的主题(2022年),因此我认为它仍然适用于当前的标准。

@Configuration
@RequiredArgsConstructor
class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    private final KeycloakLogoutHandler keycloakLogoutHandler;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests() //
                .anyRequest().fullyAuthenticated() //
                .and().oauth2Client() //
                .and().oauth2Login().tokenEndpoint().and().userInfoEndpoint().userAuthoritiesMapper(userAuthoritiesMapper()) //
                .and().and()
                .logout().addLogoutHandler(keycloakLogoutHandler)
        ;
    }

    private GrantedAuthoritiesMapper userAuthoritiesMapper() {
    [...]

我玩了一些沿着的东西。再说一次...除了已知的标记为deprecatedoauth2Client()oauth2Login()等)的罪魁祸首之外,最大的问题是WebSecurityConfigurerAdapter也被弃用了。当打开issue #12514时,我被告知应该继续使用类似于第一种方法的SecurityFilterChain
无论哪种方式,我已经烧了大约10+教程现在,无法找到一个工作项目,这是-考虑到KeyCloak的大小-非常奇怪。我发现的唯一好的信息是去年的旧KeyCloak adapters were deprecated...虽然我还没有使用过它们,正如你在上面看到的。

有人能帮我吗?我想设置一个SIMPLESecurityConfig来构建基础。只需从请求中获取承载令牌(顺便说一句,KeyCloak相关的设置工作),然后验证JWT并将用户角色/权限与端点上的所需角色进行比较 (最好不是全局设置,而是每个端点的本地设置)

46scxncf

46scxncf1#

如果你的Spring应用只是作为一个资源服务器,请看我的例子:https://github.com/dasniko/keycloak-bookshop-demo/tree/master/msgbroker
在依赖项中,只有org.springframework.boot:spring-boot-starter-oauth2-resource-server
application.properties只需要配置spring.security.oauth2.resourceserver.jwt.issuer-uriSecurityConfig类也很小。

相关问题