当前位置: 首页 > news >正文

设计最好的网站/四平网络推广

设计最好的网站,四平网络推广,免费网站建设靠谱嘛,网站原创文章1、概览 本文将带你了解如何设置 Keycloak 服务器,以及如何使用 Spring Security OAuth2.0 将 Spring Boot 应用连接到 Keycloak 服务器。 2、Keycloak 是什么? Keycloak 是针对现代应用和服务的开源身份和访问管理解决方案。 Keycloak 提供了诸如单…

1、概览

本文将带你了解如何设置 Keycloak 服务器,以及如何使用 Spring Security OAuth2.0 将 Spring Boot 应用连接到 Keycloak 服务器。

2、Keycloak 是什么?

Keycloak 是针对现代应用和服务的开源身份和访问管理解决方案。

Keycloak 提供了诸如单点登录(SSO)、身份代理和社交登录、用户联盟、客户端适配器、管理控制台和账户管理等功能。

本文使用 Keycloak 的管理控制台,使用 Spring Security OAuth2.0 设置和连接 Spring Boot。

3、设置 Keycloak 服务器

设置和配置 Keycloak 服务器。

3.1、下载和安装 Keycloak

有多种发行版可供选择,本文使 Keycloak-22.0.3 独立服务器发行版。点击 这里 从官方下载。

下载完后,解压缩并从终端启动 Keycloak:

unzip keycloak-22.0.3.zip 
cd keycloak-22.0.3
bin/kc.sh start-dev

运行这些命令后,Keycloak 会启动服务。如果你看到一行类似于 Keycloak 22.0.3 [...] started 的内容,就表示服务器启动成功。

打开浏览器,访问 http://localhost:8080,会被重定向到 http://localhost:8080/auth 以创建管理员进行登录:

创建一个名为 initial1 的初始管理员用户,密码为 zaq1!QAZ。点击 “Create”后,可以看到 “User Created” 的提示信息。

现在进入管理控制台。在登录页面,输入 initial 管理员用户凭证:

3.2、创建 Realm

登录成功后,进入控制台,默认为 Master Realm。

导航到左上角,找到 “Create realm” 按钮:

点击它,添加一个名为 SpringBootKeycloak 的新 Realm:

单击 “Create” 按钮,创建一个新的 Realm。会被重定向到该 Realm。接下来的所有操作都将在这个新的 SpringBootKeycloak Realm 中执行。

3.3、创建客户端

现在进入 “Clients” 页面。如下图所示,Keycloak 已经内置了客户端:

我们需要在应用中添加一个新客户端,点击 “Create”,将新客户端命名为 login-app

在下一步的设置中,除了 “Valid Redirect URIs” 字段外,其他字段保留所有默认值。该字段包含将使用此客户端进行身份验证的应用 URL:

稍后,我们会创建一个运行于 8081 端口的 Spring Boot 应用,该应用将使用该客户端。因此,在上面使用了 http://localhost:8081/ 的重定向 URL。

3.4、创建角色和用户

Keycloak 使用基于角色的访问;因此,每个用户都必须有一个角色。

进入 “Realm Roles” 页面:

然后添加用户角色:

现在有了一个可以分配给用户的角色,但由于还没有用户,让我们去 “Users” 页面添加一个:

添加一个名为 user1 的用户:

用户创建后,会显示一个包含其详细信息的页面:

现在进入 “Credentials” 选项卡。把初始密码设置为 xsw2@WS

最后,进入 “Role Mappings” 选项卡。为 user1 分配用户角色:

4、使用 Keycloak API 生成 Access Token

Keycloak 提供了用于生成和刷新 Access Token 的 REST API,可用于创建自己的登录页面。

首先,向如下 URL 发送 POST 请求,从 Keycloak 获取 Access Token:

http://localhost:8080/realms/SpringBootKeycloak/protocol/openid-connect/token

请求体应包含 x-www-form-urlencoded 格式的参数:

client_id:<your_client_id>
username:<your_username>
password:<your_password>
grant_type:password

这会得到一个 access_token 和一个 refresh_token

每次请求受 Keycloak 保护的资源时,都应使用 Access Token,只需将其放在 Authorization 头中即可:

headers: {'Authorization': 'Bearer' + access_token
}

Access Token 过期后,可以通过向上述相同的 URL 发送 POST 请求来刷新 Access Token,但请求中应包含 Refresh Token,而不是用户名和密码:

{'client_id': 'your_client_id','refresh_token': refresh_token_from_previous_request,'grant_type': 'refresh_token'
}

Keycloak 会响应新的 access_token 和 refresh_token

5、创建和配置 Spring Boot 应用

创建一个 Spring Boot 应用,并将其配置为 OAuth 客户端,与 Keycloak 服务器进行交互。

5.1、依赖

使用 Spring Security OAuth2.0 客户端连接到 Keycloak 服务器。

首先,在 pom.xml 中声明 spring-boot-starter-oauth2-client 和 spring-boot-starter-security 依赖:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId>
</dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

使用 spring-boot-starter-oauth2-resource-server 将身份验证控制委托给 Keycloak 服务器。它允许我们使用 Keycloak 服务器验证 JWT Token:

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
</dependency>

现在,Spring Boot 应用可以与 Keycloak 交互了。

5.2、Keycloak 配置

将 Keycloak 客户端视为 OAuth 客户端。因此,需要配置 Spring Boot 应用以使用 OAuth 客户端。

ClientRegistration 类保存客户端的所有基本信息。Spring 自动配置会查找模式为 spring.security.oauth2.client.registration.[registrationId] 的属性,并使用 OAuth 2.0 或 OpenID Connect(OIDC) 注册客户端。

客户端注册配置:

spring.security.oauth2.client.registration.keycloak.client-id=login-app
spring.security.oauth2.client.registration.keycloak.authorization-grant-type=authorization_code
spring.security.oauth2.client.registration.keycloak.scope=openid

在 client-id 中指定的值与我们在管理控制台中命名的客户端相匹配。

Spring Boot 应用需要与 OAuth 2.0 或 OIDC Provider 交互,以处理不同授权方式的实际请求逻辑。因此,需要配置 OIDC Provider。它可以根据 Schema spring.security.oauth2.client.provider.[provider name] 的属性值自动配置。

OIDC Provider 配置:

spring.security.oauth2.client.provider.keycloak.issuer-uri=http://localhost:8080/realms/SpringBootKeycloak
spring.security.oauth2.client.provider.keycloak.user-name-attribute=preferred_username

在 issuer-uri 中指定路径(我们是在 8080 端口启动 Keycloak 的)。该属性标识了授权服务器的基本 URI,输入在 Keycloak 管理控制台中创建的 Realm 名称。此外,还可以将 user-name-attribute 定义为 preferred_username,以便在 Controller 的 Principal 中填充合适的用户。

最后,添加针对 Keycloak 服务器验证 JWT Token 所需的配置:

spring.security.oauth2.resourceserver.jwt.issuer-uri=http://localhost:8080/realms/SpringBootKeycloak

5.3、配置类

创建 SecurityFilterChain Bean 来配置 HttpSecurity。使用 http.oauth2Login() 启用 OAuth2 登录。

创建 Security 配置:

@Configuration 
@EnableWebSecurity 
class SecurityConfig { private final KeycloakLogoutHandler keycloakLogoutHandler; SecurityConfig(KeycloakLogoutHandler keycloakLogoutHandler) { this.keycloakLogoutHandler = keycloakLogoutHandler; } @Bean protected SessionAuthenticationStrategy sessionAuthenticationStrategy() { return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl()); } @Order(1) @Bean public SecurityFilterChain clientFilterChain(HttpSecurity http) throws Exception { http.authorizeRequests() .requestMatchers(new AntPathRequestMatcher("/")) .permitAll() .anyRequest() .authenticated(); http.oauth2Login() .and() .logout() .addLogoutHandler(keycloakLogoutHandler) .logoutSuccessUrl("/"); return http.build(); } @Order(2) @Bean public SecurityFilterChain resourceServerFilterChain(HttpSecurity http) throws Exception { http.authorizeRequests() .requestMatchers(new AntPathRequestMatcher("/customers*")) .hasRole("USER") .anyRequest() .authenticated(); http.oauth2ResourceServer((oauth2) -> oauth2.jwt(Customizer.withDefaults()));return http.build(); } @Bean public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception { return http.getSharedObject(AuthenticationManagerBuilder.class) .build(); } 
}

在上面的代码中,oauth2Login() 方法将 OAuth2LoginAuthenticationFilter 添加到过滤器链中。该过滤器会拦截请求并应用 OAuth 2 身份验证所需的逻辑。oauth2ResourceServer 方法将根据 Keycloak 服务器验证绑定的 JWT Token。

在 configure() 方法中根据权限和角色配置访问权限。这些约束条件可确保对 /customers/* 的每个请求只有在请求者是具有 USER 角色的经过身份验证的用户时才会获得授权。

最后,添加了 KeycloakLogoutHandler 类来处理 Keycloak 注销:

@Component
public class KeycloakLogoutHandler implements LogoutHandler {private static final Logger logger = LoggerFactory.getLogger(KeycloakLogoutHandler.class);private final RestTemplate restTemplate;public KeycloakLogoutHandler(RestTemplate restTemplate) {this.restTemplate = restTemplate;}@Overridepublic void logout(HttpServletRequest request, HttpServletResponse response, Authentication auth) {logoutFromKeycloak((OidcUser) auth.getPrincipal());}private void logoutFromKeycloak(OidcUser user) {String endSessionEndpoint = user.getIssuer() + "/protocol/openid-connect/logout";UriComponentsBuilder builder = UriComponentsBuilder.fromUriString(endSessionEndpoint).queryParam("id_token_hint", user.getIdToken().getTokenValue());ResponseEntity<String> logoutResponse = restTemplate.getForEntity(builder.toUriString(), String.class);if (logoutResponse.getStatusCode().is2xxSuccessful()) {logger.info("Successfulley logged out from Keycloak");} else {logger.error("Could not propagate logout to Keycloak");}}}

KeycloakLogoutHandler 类实现了 LogoutHandler,并向 Keycloak 发送注销请求。

现在,通过身份验证后,就可以访问内部 customers 页面了。

5.4、Thymeleaf Web 页面

使用 Thymeleaf 渲染页面。

有三个页面:

  • external.html - 面向外部的页面
  • customers.html - 面向内部的页面,其访问权限仅限于具有 user 角色的认证用户
  • layout.html - 一个简单的布局,由两个片段组成,分别用于面向外部的页面和面向内部的页面

Thymeleaf 模板的代码可在 Github 上获取。

5.5、Controller

Web Controller 会将内部和外部 URL 映射到相应的 Thymeleaf 模板:

@GetMapping(path = "/")
public String index() {return "external";
}@GetMapping(path = "/customers")
public String customers(Principal principal, Model model) {addCustomers();model.addAttribute("customers", customerDAO.findAll());model.addAttribute("username", principal.getName());return "customers";
}

/customers 会从 Repository 中检索所有客户,并将结果作为属性添加到 Model 中。之后,在 Thymeleaf 中遍历结果。

为了能够显示用户名,还注入了 Principal

注意,这里只是将客户(customers)作为原始数据来显示,仅此而已。

6、演示

现在,测试应用。通过集成开发环境(如 Spring Tool Suite - STS)运行 Spring Boot 应用,或者在终端运行如下命令:

mvn clean spring-boot:run

访问 http://localhost:8081,如下:

现在,点击 “customers” 户进入内部页面,这是敏感信息的位置。

然后会被重定向到通过 Keycloak 进行身份验证,以检查我们是否被授权查看此内容:

用 user1 的凭证登录,Keycloak 会验证我们的授权,确认我们拥有用户角色,然后会被重定向到受限的 “customers” 页面:

现在,整个流程已经完毕了。你可以看到,Spring Boot 无缝地处理了调用 Keycloak 授权服务器的整个过程。我们无需调用 Keycloak API 自己生成 Access Token,甚至无需在请求受保护资源时明确发送 Authorization 头。

7、总结

本文介绍了如何如何设置了 Keycloak 服务器,以及如何在 Spring Boot 中使用 Spring Security OAuth2.0 结合 Keycloak 实现认证和授权。


Ref:https://www.baeldung.com/spring-boot-keycloak

相关文章:

Spring Boot 整合 Keycloak

1、概览 本文将带你了解如何设置 Keycloak 服务器&#xff0c;以及如何使用 Spring Security OAuth2.0 将 Spring Boot 应用连接到 Keycloak 服务器。 2、Keycloak 是什么&#xff1f; Keycloak 是针对现代应用和服务的开源身份和访问管理解决方案。 Keycloak 提供了诸如单…...

工程师 - Windows下使用WSL来访问本地的Linux文件系统

Access Linux filesystems in Windows and WSL 2 从 Windows Insiders 预览版构建 20211 开始&#xff0c;WSL 2 将提供一项新功能&#xff1a;wsl --mount。这一新参数允许在 WSL 2 中连接并挂载物理磁盘&#xff0c;从而使您能够访问 Windows 本身不支持的文件系统&#xff0…...

SQL高可用优化-优化SQL中distinct和Where条件对索引字段进行非空检查语句

最近做一个需求&#xff0c;关于SQL高可用优化&#xff0c;需要优化项目中的SQL&#xff0c;提升查询效率。 SQL高可用优化 一、优化SQL包含distinct场景二、优化SQL中Where条件中索引字段是否为NULL三、代码验证1. NodeMapper2. NodeService3. NodeController4.数据库数据5.项…...

openharmony源码编译

1. win拷贝数据到虚拟机Ubuntu配置 1.打开终端&#xff0c;更新软件库 sudo apt-get update 2.下载安装open-vm-tools&#xff0c;open-vm-tools-desktop sudo apt-get install open-vm-tools open-vm-tools-desktop 3.重启 sudo reboot 2.编译环境配置 1.设置环境脚本…...

H.264编解码工具 - NVIDIA CUDA

一、简介 NVIDIA CUDA编解码是一项采用NVIDIA图形处理器(GPU)来加速视频编码和解码的技术。CUDA(Compute Unified Device Architecture)是一种并行计算平台和编程模型,允许开发者使用GPU来进行通用计算。 优点: 加速编解码速度:CUDA编解码利用GPU的并行处理能力,可以…...

数学建模小练习

题目B 电影《虎胆龙威 3》中&#xff0c;塞谬尔和布鲁斯扮演的主角要拆除西蒙所放的炸弹。西蒙喷泉上面有两个壶&#xff0c;容量分别是5加仑和3加仑&#xff0c;向其中一个壶中加入刚好 4 加仑的水&#xff0c;计时器会停止&#xff0c;否则5分钟后会爆炸。 问题:能够安全拆弹…...

Java爬虫:获取SKU详细信息的艺术

在电子商务的世界里&#xff0c;SKU&#xff08;Stock Keeping Unit&#xff0c;库存单位&#xff09;是每个商品的唯一标识符&#xff0c;它包含了商品的详细信息&#xff0c;如尺寸、颜色、价格等。对于商家和开发者来说&#xff0c;获取商品的SKU详细信息对于库存管理、订单…...

心理咨询展示网站建设渠道拓展

心理问题长期以来都受到关注&#xff0c;每个城市里也都有相关服务商家&#xff0c;除了进店外&#xff0c;线上也可以开展咨询服务&#xff0c;对需求者来说需要找到靠谱的品牌&#xff0c;而商家也需要触达到更多客户获取转化。 网站是品牌线上工具&#xff0c;利于商家通过…...

naocs注册中心,配置管理,openfeign在idea中实现模块间的调用,getway的使用

一 naocs注册中心步骤 1 nacos下载安装 解压安装包&#xff0c;直接运行bin目录下的startup.cmd 这里双击运行出现问题的情况下 &#xff08;版本低的naocs&#xff09; 在bin目录下 打开cmd 运行以下命令 startup.cmd -m standalone 访问地址&#xff1a; http://localh…...

先进封装技术 Part02---TSV科普

一、引言 随着电子设备向更小型化、更高性能的方向发展,传统的芯片互连技术已经无法满足日益增长的需求。在这样的背景下,TSV(Through-Silicon Via,硅通孔)技术应运而生,成为先进封装技术中的核心之一。 如果我们看大多数主板,可以看到两件事:第一,芯片之间的大多数连…...

【数据挖掘】2023年 Quiz 1-3 整理 带答案

目录 Quiz 1Quiz 2Quiz 3Quiz 1 Problem 1(30%). Consider the training data shown below. Here, A , B A, B A,B, and...

老古董Lisp实用主义入门教程(12):白日梦先生的白日梦

白日梦先生的白日梦 白日梦先生已经跟着大家一起学Lisp长达两个月零五天&#xff01; 001 粗鲁先生Lisp再出发002 懒惰先生的Lisp开发流程003 颠倒先生的数学表达式004 完美先生的完美Lisp005 好奇先生用Lisp来探索Lisp006 好奇先生在Lisp的花园里挖呀挖呀挖007 挑剔先生给出…...

UE5 Windows热更新解决方案思路(HotPatcher+Tomcat+RuntimeFilesDownloader)

以下个人学习笔记。其中必会存在一些问题&#xff0c;仅作参考。本人版本5.1。 参考视频&#xff1a; UE4热更新&#xff1a;HotPatcher插件使用教程_哔哩哔哩_bilibili 3.检查需要下载的版本_哔哩哔哩_bilibili 参考文章&#xff1a; UE 热更新&#xff1a;Questions &…...

进程管理工具:非daemon进程管理工具supervisor

一、非daemon进程管理工具&#xff1a;supervisor Windows安装supervisor https://pypi.org/project/supervisor-win/4.5.0/#files 一&#xff09;进程管理supervisor简介 supervisor是一个 Client/Server模式的系统&#xff0c;允许用户在类unix操作系统上监视和控制多个进程&…...

c++模拟真人鼠标轨迹算法

一.鼠标轨迹算法简介 鼠标轨迹底层实现采用 C / C语言&#xff0c;利用其高性能和系统级访问能力&#xff0c;开发出高效的鼠标轨迹模拟算法。通过将算法封装为 DLL&#xff08;动态链接库&#xff09;&#xff0c;可以方便地在不同的编程环境中调用&#xff0c;实现跨语言的兼…...

android12/13/14版本wms最新面试题:dumpsys window和sf一定会一致么?

背景&#xff1a; 近期学员们学习了马哥wms课程后&#xff0c;去参加相关的大厂的framework面试&#xff0c;有一个学员朋友带回来了一个wms相关的面试题&#xff0c;具体面试题描述如下&#xff1a; 问题1 请问wms的window和SurfaceFlinger的Layer有什么关系&#xff1f; 回…...

Python脚本示例,你可以使用这个脚本来自动化登录网站、选择页面元素和提交表单

devtools 元素页面可以选择元素&#xff0c;copy xpath用于查找 python编程&#xff1a;1、浏览器登录https://58.xxx/ 账号:xxx 密码:FN123456 2、选择“技能训练” 3、选择“云网智能运维员培训相关资料” 4、选择“L1-Linux操作系统与运维题库” 5、依次选择1-50题目&#x…...

安卓13设置动态修改设置显示版本号 版本号增加信息显示 android13增加序列号

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 =》关于平板电脑 =》版本号 在这里显示了系统的一些信息,但是这里面的信息并不包含序列号之类的信息,我们修改下系统设置,在这里增加上相关的序列号。 2.问题分析…...

从 Oracle 集群到单节点环境(详细记录一次数据迁移过程)之三:在目标服务器上恢复数据

从 Oracle 集群到单节点环境&#xff08;详细记录一次数据迁移过程&#xff09;之三&#xff1a;在目标服务器上恢复数据 目录 从 Oracle 集群到单节点环境&#xff08;详细记录一次数据迁移过程&#xff09;之三&#xff1a;在目标服务器上恢复数据一、修改参数文件的内容二、…...

相互作用感知的 3D 分子生成 VAE 模型 - DeepICL 评测

DeepICL 是一个基于相互作用感知的 3D 分子生成模型&#xff0c;能够在目标结合口袋内进行相互作用引导的小分子设计。DeepICL 通过利用蛋白质-配体相互作用的普遍模式作为先验知识&#xff0c;在有限的实验数据下也能实现高度的泛化能力。 一、背景介绍 DeepICL 来源于韩国科学…...

Java实现随机抽奖的方法有哪些

在Java中实现随机抽奖的方法&#xff0c;通常我们会使用java.util.Random类来生成随机数&#xff0c;然后基于这些随机数来选择中奖者。以下将给出几种常见的随机抽奖实现方式&#xff0c;包括从数组中抽取、从列表中抽取以及基于权重的抽奖方式。 1. 从数组中抽取 import ja…...

grafana加载缓慢解决方案

背景 目前随着数据和图表的逐渐增多&#xff0c;Grafana 页面加载速度明显变慢&#xff0c;严重影响了用户体验&#xff0c;几次都有骂娘的冲动.&#xff0c;因此我们需要对 Grafana 进行优化&#xff0c;以提升加载性能。 对于速度优化&#xff0c;我们可以从以下方面进行入…...

【湖南步联科技身份证】 身份证读取与酒店收银系统源码整合———未来之窗行业应用跨平台架构

一、html5 <!DOCTYPE html> <html><head><meta http-equiv"Content-Type" content"text/html; charsetutf-8" /><script type"text/javascript" src"http://51.onelink.ynwlzc.net/o2o/tpl/Merchant/static/js…...

多路复用和事件轮询机制

多路复用&#xff1a;Nio 服务端只有一个线程处理多个连接 事件轮询机制&#xff1a;select 底层用了 epoll。 select open 调用了 epoll 通过3个方法来实现事件轮询 1.epoll.create 创建epoll 多个集合 2.epoll.ctl 如果有事件会把事件挪到就绪事件列表。 3.epoll.wait 会监听…...

Android常用C++特性之std::abs

声明&#xff1a;本文内容生成自ChatGPT&#xff0c;目的是为方便大家了解学习作为引用到作者的其他文章中。 std::abs 是 C 标准库中的一个函数&#xff0c;用于计算整数、浮点数或其他数值类型的绝对值。它返回一个值&#xff0c;该值是参数的非负数形式&#xff0c;即去掉负…...

LabVIEW提高开发效率技巧----使用状态机架构

状态机架构&#xff08;State Machine Architecture&#xff09;是LabVIEW编程中的一种常见且高效的设计模式&#xff0c;特别适合用于处理具有多个操作状态的复杂系统。通过这种架构&#xff0c;程序能够根据不同的输入条件或事件&#xff0c;在多个状态之间切换&#xff0c;从…...

Feign:服务挂了也不会走fallback

Feign 本质上是一个 HTTP 客户端&#xff0c;用于简化微服务之间的 HTTP 通信。它允许开发者通过定义接口和注解来声明式地编写 HTTP 客户端&#xff0c;而无需手动编写 HTTP 请求和响应处理的代码。 今天在模拟微服务A feign调用微服务B的时候&#xff0c;把微服务B关了&#…...

网络编程操作—函数

一、socket创建套接字 #include <sys/types.h> //头文件 #include <sys/socket.h> int socket(int domain, int type, int protocol); 三个参数&#xff1a;domain、type、protocol 1.domain:域名&#xff0c;领域&#xff0c;定义域&#xff08;中文解释&…...

博客摘录「 GD32的flash读、擦除、写操作」2024年9月2日

关于GD32的Flash读、擦除、写操作,以下是基于当前可获得信息(截至2024年9月2日)的详细解答: 一、GD32 Flash的基本特性 存储空间:GD32的Flash存储空间大小因型号而异,可支持从几KB到几MB不等的存储容量。页大小:Flash按页组织,不同型号的GD32其页大小可能不同。例如,…...

【性能优化】低配starRocks常驻内存优化

背景说明 由于服务器的实际资源小于starRocks官方的配置&#xff0c;导致starRocks在无任务的情况下&#xff0c;常驻内存偏高&#xff0c;可用于查询的资源变小。 官方文档 实际部署的集群一般是4C8G和8C16G&#xff0c;be的配置不达标 为了解决单次查询内存不足的问题&…...