在往年2月14日的时候,Keycloak 团队发表他们正在弃用大多数 Keycloak 适配器。其中包含Spring Security和Spring Boot的适配器,这意味着今后Keycloak团队将不再提供针对Spring Security和Spring Boot的集成计划。然而,如此弱小的Keycloak,还要用怎么办呢?本文就来聊聊,在最新的Spring Boot 3.1版本之下,如何将Keycloak和Spring Security一起跑起来。

筹备工作

这里所采纳的框架与工具版本信息如下:

  • Spring Boot 3.1.0
  • Keycloak 21.1.1

如果您采纳的是其余版本,本文内容不肯定无效,但能够作为参考。

配置Keycloak

第一步:为Spring Boot利用创立Realm,并在上面创立一个Client

第二步:创立一个SYS_ADMIN角色,并创立一个用户赋予SYS_ADMIN角色

第三步:调用Keycloak接口生成Access Token,能够用上面的curl命令或者其余任何发申请的工具,比方:Postman等。

curl --location 'http://localhost:9090/realms/MyAppRealm/protocol/openid-connect/token' \--header 'Content-Type: application/x-www-form-urlencoded' \--data-urlencode 'username=<YOUR_USER_NAME>' \--data-urlencode 'password=<YOUR_USER_PASSWORD>' \--data-urlencode 'grant_type=password' \--data-urlencode 'client_id=My-Awesome-App' \--data-urlencode 'client_secret=<KEYCLOAK_CLIENT_SECRET>' \--data-urlencode 'scope=openid'

记住取得到Access Token,后续验证时候要用。

如果您学习过程中如遇艰难?能够退出咱们超高品质的Spring技术交换群,参加交换与探讨,更好的学习与提高!

配置Spring Boot利用

第一步:创立一个Spring Boot利用,这个很简略,这里不赘述了。如果您还不会,能够看看我的Spring Boot教程

第二步:在pom.xml中增加依赖:

<dependency>   <groupId>org.springframework.security</groupId>   <artifactId>spring-security-oauth2-jose</artifactId></dependency>

第三步:批改配置文件

spring:  security:    oauth2:      resourceserver:        jwt:          issuer-uri: http://localhost:9090/realms/MyAppRealm          jwk-set-uri: http://localhost:9090/realms/MyAppRealm/protocol/openid-connect/certs

第四步:创立一个须要鉴权的测试接口

@RequestMapping("/test")@RestControllerpublic class MySuperSecuredController {    @GetMapping("/hello")    public String hello(){        return "hello";    }}

第五步:创立SecurityFilterChain,用来告知Spring Security在JWT令牌中查找角色信息的地位。

@Configuration@EnableWebSecuritypublic class WebSecurityConfig {    @Bean    public SecurityFilterChain securityFilterChain(HttpSecurity httpSecurity) throws Exception {        httpSecurity                .authorizeHttpRequests(registry -> registry                        .requestMatchers("/test/**").hasRole("SYS_ADMIN")                        .anyRequest().authenticated()                )                .oauth2ResourceServer(oauth2Configurer -> oauth2Configurer.jwt(jwtConfigurer -> jwtConfigurer.jwtAuthenticationConverter(jwt -> {                    Map<String, Collection<String>> realmAccess = jwt.getClaim("realm_access");                    Collection<String> roles = realmAccess.get("roles");                    var grantedAuthorities = roles.stream()                            .map(role -> new SimpleGrantedAuthority("ROLE_" + role))                            .toList();                    return new JwtAuthenticationToken(jwt, grantedAuthorities);                })))        ;        return httpSecurity.build();    }}

验证一下

在实现了下面配置所有之后之后,启动Spring Boot利用,同时保障Keycloak也在运行中。

尝试申请/test/hello接口:

  • 当不蕴含Authorization头信息的时候,将返回401谬误
  • 当蕴含Authorization头信息(前文用调接口获取的Access Token)的时候,能力正确拜访到。

小结

尽管Keycloak 团队发表了不再对Spring Security提供适配,但Spring Security长期以来始终为OAuth和OIDC提供弱小的内置反对。所以,只有咱们了解Spring Security是如何解决OAuth和OIDC的,那么与Keyloak的集成仍然不简单。好了,明天的分享就到这里!如果您学习过程中如遇艰难?能够退出咱们超高品质的Spring技术交换群,参加交换与探讨,更好的学习与提高!

欢送关注我的公众号:程序猿DD。第一工夫理解前沿行业音讯、分享深度技术干货、获取优质学习资源