在今年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")
@RestController
public class MySuperSecuredController {
@GetMapping("/hello")
public String hello(){
return "hello";
}
}
第五步:创立SecurityFilterChain
,用来告知Spring Security在JWT令牌中查找角色信息的方位。
@Configuration
@EnableWebSecurity
public 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。第一时间了解前沿职业消息、共享深度技能干货、获取优质学习资源