0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Spring Boot 3.1 中如何整合Spring Security和Keycloak

jf_ro2CN3Fa 来源:程序猿DD 2023-06-08 14:54 次阅读


7bfd843c-0580-11ee-8a94-dac502259ad0.png

在今年2月14日的时候,Keycloak 团队宣布他们正在弃用大多数 Keycloak 适配器。其中包括Spring Security和Spring Boot的适配器,这意味着今后Keycloak团队将不再提供针对Spring Security和Spring Boot的集成方案。

7c0957da-0580-11ee-8a94-dac502259ad0.png

但是,如此强大的Keycloak,还要用怎么办呢?本文就来聊聊,在最新的Spring Boot 3.1版本之下,如何将Keycloak和Spring Security一起跑起来。

准备工作

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

  • Spring Boot 3.1.0
  • Keycloak 21.1.1

如果您采用的是其他版本,本文内容不一定有效,但可以作为参考。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 视频教程:https://doc.iocoder.cn/video/

配置Keycloak

第一步:为Spring Boot应用创建Realm,并在下面创建一个Client

7c1234cc-0580-11ee-8a94-dac502259ad0.png

第二步:创建一个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='
--data-urlencode'password='
--data-urlencode'grant_type=password'
--data-urlencode'client_id=My-Awesome-App'
--data-urlencode'client_secret='
--data-urlencode'scope=openid'

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

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud
  • 视频教程:https://doc.iocoder.cn/video/

配置Spring Boot应用

第一步:创建一个Spring Boot应用,这个很简单,这里不赘述了。

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

<dependency>
<groupId>org.springframework.securitygroupId>
<artifactId>spring-security-oauth2-joseartifactId>
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
publicclassMySuperSecuredController{

@GetMapping("/hello")
publicStringhello(){
return"hello";
}

}

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

@Configuration
@EnableWebSecurity
publicclassWebSecurityConfig{


@Bean
publicSecurityFilterChainsecurityFilterChain(HttpSecurityhttpSecurity)throwsException{
httpSecurity
.authorizeHttpRequests(registry->registry
.requestMatchers("/test/**").hasRole("SYS_ADMIN")
.anyRequest().authenticated()
)
.oauth2ResourceServer(oauth2Configurer->oauth2Configurer.jwt(jwtConfigurer->jwtConfigurer.jwtAuthenticationConverter(jwt->{
Map>realmAccess=jwt.getClaim("realm_access");
Collectionroles=realmAccess.get("roles");
vargrantedAuthorities=roles.stream()
.map(role->newSimpleGrantedAuthority("ROLE_"+role))
.toList();
returnnewJwtAuthenticationToken(jwt,grantedAuthorities);
})))
;

returnhttpSecurity.build();
}
}

验证一下

在完成了上面配置所有之后之后,启动Spring Boot应用,同时保证Keycloak也在运行中。

尝试请求/test/hello接口:

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

小结

虽然Keycloak 团队宣布了不再对Spring Security提供适配,但Spring Security长期以来一直为OAuth和OIDC提供强大的内置支持。所以,只要我们理解Spring Security是如何处理OAuth和OIDC的,那么与Keyloak的集成依然不复杂。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 适配器
    +关注

    关注

    8

    文章

    1938

    浏览量

    67944
  • 框架
    +关注

    关注

    0

    文章

    399

    浏览量

    17446
  • spring
    +关注

    关注

    0

    文章

    338

    浏览量

    14319

原文标题:Spring Boot 3.1 中如何整合Spring Security和Keycloak

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    Spring bootRedis的使用

    【本人秃顶程序员】springboot专辑:Spring bootRedis的使用
    发表于 03-27 11:42

    Mybatis整合spring的思路和步骤

    1、整合思路(1)SqlSessionFactory对象应该放到spring容器作为单例存在。(2)传统dao的开发方式,应该从spring
    发表于 11-04 09:06

    启动Spring Boot项目应用的三种方法

    ,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是spring boot其实不是什么新的框架,它默认配置了很多框架的使用方式,就像maven整合了所有的jar包,spring
    发表于 01-14 17:33

    Spring Boot嵌入式Web容器原理是什么

    Spring Boot嵌入式Web容器原理Spring Boot的目标是构建“非常容易创建、独立、产品级别的基于Spring的应用”。这些应
    发表于 12-16 07:57

    Spring Boot从零入门1 详述

    在开始学习Spring Boot之前,我之前从未接触过Spring相关的项目,Java基础还是几年前自学的,现在估计也忘得差不多了吧,写Spring
    的头像 发表于 12-10 22:18 614次阅读

    Spring认证」什么是Spring GraphQL?

    这个项目建立在 Boot 2.x 上,但它应该与最新的 Boot2.4.x5 相关。 要创建项目,请转到start.spring.io并为要使用的GraphQL传输选择启动器: 启动机 运输 执行
    的头像 发表于 08-10 14:08 799次阅读
    「<b class='flag-5'>Spring</b>认证」什么是<b class='flag-5'>Spring</b> GraphQL?

    Spring Boot特有的实践

    Spring Boot是最流行的用于开发微服务的Java框架。在本文中,我将与你分享自2016年以来我在专业开发中使用Spring Boot所采用的最佳实践。这些内容是基于我的个人经验
    的头像 发表于 09-29 10:24 886次阅读

    强大的Spring Boot 3.0要来了

    和 Bugfix。 Spring Boot 3.0 的开发工作始于实验性的 Spring Native,旨在为 GraalVM 原生镜像提供支持。 在该版本,开发者现在可以使用标准
    的头像 发表于 10-31 11:17 1788次阅读

    Spring Boot整合两种定时任务的方法

    框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具备这两个 Spring 的定时任务实现策
    的头像 发表于 04-07 14:55 1522次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b><b class='flag-5'>中</b><b class='flag-5'>整合</b>两种定时任务的方法

    Spring Boot如何使用定时任务

    本文介绍在 Spring Boot 如何使用定时任务,使用非常简单,就不做过多说明了。
    的头像 发表于 04-12 10:56 959次阅读

    Spring Boot Actuator快速入门

    不知道大家在写 Spring Boot 项目的过程,使用过 Spring Boot Actuator 吗?知道
    的头像 发表于 10-09 17:11 618次阅读

    Spring Boot启动 Eureka流程

    在上篇已经说过了 Eureka-Server 本质上是一个 web 应用的项目,今天就来看看 Spring Boot 是怎么启动 Eureka 的。 Spring
    的头像 发表于 10-10 11:40 863次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>启动 Eureka流程

    Spring Boot的启动原理

    可能很多初学者会比较困惑,Spring Boot 是如何做到将应用代码和所有的依赖打包成一个独立的 Jar 包,因为传统的 Java 项目打包成 Jar 包之后,需要通过 -classpath 属性
    的头像 发表于 10-13 11:44 627次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>的启动原理

    Spring Boot 的设计目标

    什么是Spring Boot Spring BootSpring 开源组织下的一个子项目,也是 S
    的头像 发表于 10-13 14:56 561次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b> 的设计目标

    如何在Spring Boot应用程序整合ZXing库

    在数字化时代,二维码已经成为了信息交流的一种常见方式。它们被广泛用于各种应用,从产品标签到活动传单,以及电子支付。本文将向您展示如何在Spring Boot应用程序整合ZXing库,
    的头像 发表于 12-03 17:39 1068次阅读