Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring Boot+Keycloak从零到壹

Spring Boot+Keycloak从零到壹

作者头像
烟雨平生
发布于 2023-03-07 08:20:05
发布于 2023-03-07 08:20:05
4.5K00
代码可运行
举报
文章被收录于专栏:数字化之路数字化之路
运行总次数:0
代码可运行
原文链接:https://www.baeldung.com/spring-boot-keycloak

作者: Michael Good

译者: helloworldtang

1. 概览

在本文中,我们将介绍安装、配置Keycloak服务器的基础知识,如何将Spring Boot应用程序**和Keycloak服务器连接起来,以及在Spring Security下如何使用它。

2. Keycloak是什么?

Keycloak是一种面向现代应用程序和服务的开源的IAM(身份识别与访问管理)解决方案。

Keycloak提供了单点登录(SSO)、Identity Brokering和社交账号登录、User Federation、客户端适配器、管理控制台和帐户管理控制台等特性。想了解更多关于Keycloak的信息,请访问官方页面 。

在本教程中,我们将使用Keycloak的管理控制台进行配置,然后在Spring Boot应用程序中使用Keycloak Client Adapter和Keycloak服务器连接起来。

3. 安装并配置Keycloak服务器

3.1. 下载并安装Keycloak

Keycloak提供了多个发行版可供选择。 但是,在本教程中,我们将使用独立版本。

从官方来源下载Keycloak-3.3.0.Final独立服务器发行版 。

下载独立的服务器发行版后,我们在本地终端解压并启动Keycloak:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
unzip keycloak-3.3.0.Final.zip
cd keycloak-3.3.0.Final/bin
./standalone.sh -Djboss.socket.binding.port-offset=100

执行./standalone.sh后,Keycloak将开始提供服务。当看到控制台输出中包含Keycloak 3.3.0.Final (WildFly Core 3.0.1.Final)字样的信息,我们就知道Keycloak已经启动成功了。

打开浏览器并访问http://localhost:8180. 我们将被重定向到http://localhost:8180/auth 去创建一个初始的admin用户:

让我们创建一个名为“initial1”的用户,密码“zaq1!QAZ“。 我们现在看到了“Welcome to Keycloak”页面:

现在我们可以继续在管理控制台上进行操作。

3.2. 创建一个Realm

让我们将鼠标导航到左上角,找到“Add Realm”按钮:

我们把它命名为“SpringBootKeycloak“:

3.3. 创建一个客户端

现在我们将导航到Clients页面。正如我们在下图中所看到的,Keycloak已经整合了已经内置的客户端

我们需要在应用程序中添加一个客户端,所以我们点击“Create”。我们配置新的Client ID为“login-app“:

在下一个页面中,对于本教程而言,除了“Valid Redirect URIs 字段”之外,我们将保留所有缺省值。配置完成后,将被重定向到端口8081:

3.4. 创建一个角色和用户

Keycloak使用Role-Based Access。因此,每个用户都必须有一个角色。 我们需要导航到“Role”页面:

然后,我们添加 “user”角色:

现在我们已经有了一个可以分配给用户的角色,但是还没有一个用户。因此,让我们去“Users”页面新增一个:

我们创建用户“user1”:

如果用户被创建,用户信息将展示在这里:

我们现在可以进入“Credentials”选项卡,并将把密码设置为“xsw2@WSX”:

我们导航到“Role Mappings”选项卡,并分配用户角色:

4. 创建Spring Boot应用程序

4.1. 依赖

在 Maven Central找到最新的Spring Boot Keycloak Starter依赖。

Keycloak Spring Boot 适配器是基于 Spring Boot的自动配置,因此我们所需要做的就是将Keycloak Spring Boot starter添加到我们的项目中。

如果要在Spring Boot项目中使用Keycloak,我们需要在pom.xml文件中添加以下依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.keycloak</groupId>
    <artifactId>keycloak-spring-boot-starter</artifactId>
</dependency>

除此之外,我们还需要指定Keycloak的dependencyManagement :

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.keycloak.bom</groupId>
            <artifactId>keycloak-adapter-bom</artifactId>
            <version>3.3.0.Final</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

如果使用Spring Boot Keycloak Starter,我们不需要任何额外的依赖就可以支持以下嵌入式Web容器:

  • Tomcat
  • Undertow
  • Jetty

4.2. Thymeleaf Web页面

我们使用Thymeleaf来实现web页面。 我们已经创建了以下三个页面:

  • external.html – 不需要身份认证的web页面
  • customers.html– 需要通过认证并且具有“user”角色的用户才能访问的web页面。
  • layout.html– 一个由两个fragment组成的简单布局,用于external.html 和 customers.html 页面

与Thymeleaf模板相关的代码已经放在Github上了。

4.3. 控制器

Web控制器将内部和外部的URL映射到对应的Thymeleaf模板:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GetMapping(path = "/")
public String index() {
    return "external";
}

@GetMapping(path = "/customers")
public String customers(Model model) {
    addCustomers();
    model.addAttribute("customers", customerDAO.findAll());
    return "customers";
}

对于URL路径/customers,我们检索所有客户数据,并将结果作为属性添加到Model中。稍后,我们将在Thymeleaf中遍历这些客户数据。

4.4. Keycloak配置

下面是基础的,必须配置的属性:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
keycloak.auth-server-url=http://localhost:8180/auth
keycloak.realm=SpringBootKeycloak
keycloak.resource=login-app
keycloak.public-client=true

正如我们所记得的,我们在8180端口上启动了Keycloak,因此配置keycloak.auth-server-url的值为验证服务器的URL,并且配置了在Keycloak管理控制台中创建的realm。 我们在keycloak.resource中指定的值与我们在管理控制台中命名的client相匹配。

下面是我们将要使用的安全约束:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
keycloak.security-constraints[0].authRoles[0]=user
keycloak.security-constraints[0].securityCollections[0].patterns[0]=/customers/*

上面配置的安全约束可以确保只有通过认证,并且具有“user”角色的用户才能访问/customers/*。

4.5. 演示

现在,我们已经准备好测试我们的应用程序了。要运行Spring Boot应用程序,我们可以轻松地通过Spring Tool Suite(STS)之类的IDE启动它,或者在终端中运行命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mvn clean spring-boot:run

我们访问localhost:8080:

现在我们点击 “customers” 链接,查看存放敏感信息的内网。

可以看到,我们已经被重定向到Keycloak进行认证,并且要检查当前用户是否被授权查看这个内容:

如果通过认证,并且通过Keycloak的授权检查,我们就会被重定向到受限访问的customers页面:

现在,我们已经完成了将Spring Boot与Keycloak连接起来的配置,并演示了它是如何工作的。

现在,我们将讨论如何将Spring Security与现有的应用程序结合使用。

5. Spring Security

Spring Boot Keycloak Starter依赖中已经包含了一个Keycloak Spring Security适配器。现在我们来看看如何将Spring Security和Keycloak集成。

5.1. 依赖

如果要在Spring Boot中使用Spring Security,我们必须添加这个依赖:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
    <version>1.5.3</version>
</dependency>

最新的Spring Boot Starter Security版本可以在 Maven Central找到。

5.2. 配置类

Keycloak提供了一个很方便的基类KeycloakWebSecurityConfigurerAdapter来创建WebSecurityConfigurer实例,因为任何由Spring Security保护的应用程序都需要一个配置类来扩展WebSecurityConfigurerAdapter:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
@EnableWebSecurity
@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(
      AuthenticationManagerBuilder auth) throws Exception {

        KeycloakAuthenticationProvider keycloakAuthenticationProvider
         = keycloakAuthenticationProvider();
        keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(
          new SimpleAuthorityMapper());
        auth.authenticationProvider(keycloakAuthenticationProvider);
    }

    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(
          new SessionRegistryImpl());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http.authorizeRequests()
          .antMatchers("/customers*")
          .hasRole("user")
          .anyRequest()
          .permitAll();
    }
}

请注意上面的代码:

  • configureGlobal:任务SimpleAuthorityMapper,以确保角色不以ROLE_为前缀
  • keycloakConfigResolver:定义了我们想要使用的Spring Boot 属性文件支持而不是默认的keycloak.json

5.3. application.properties

因为已经用Spring Security设置了安全约束,所以我们可以删除之前配置在application.properties中的相关配置。 现在我们将新增这个配置到application.properties中:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
keycloak.principal-attribute=preferred_username

5.4. 控制器

为了获取到当前用户的用户名,我们需要在控制器注入Principal参数,修改后的代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@GetMapping(path = "/customers")
public String customers(Principal principal, Model model){
    addCustomers(); 
    model.addAttribute("customers", customerDAO.findAll());
    model.addAttribute("username", principal.getName());
    return "customers";
}

5.5. Thymeleaf

在div标签中,我们将添加一个问候语,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<h1>Hello, <span th:text="${username}">--name--</span>.</h1>

5.6. Demo

现在,通过认证和授权检查后,页面将跳转到内部的customers页面之后,我们将看到:

6 总结

在本教程中,我们配置了一个Keycloak服务器,并在Spring Boot应用程序中使用这个服务器。

我们还看到了如何配置Spring Security,并将其与Keycloak服务器结合使用。本文中用到的代码可以在Github上找到。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-08-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 的数字化之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Spring Security 中使用Keycloak作为认证授权服务器
Keycloak对流行的Java应用提供了适配器。在系列文章的上一篇我们演示了针对Spring Boot的安全保护,用的就是适配器的一种。Keycloak同样提供Spring Security的适配器,后续的几篇文章我们就来共同学习Spring Security适配器的使用。 ❝ Keycloak的安装可参考前面的系列教程。 适配器集成 在Spring 应用中我们集成keycloak-spring-security-adapter: <dependency>     <groupId>org.keycloa
程序猿DD
2023/04/04
2.5K0
Spring Security 中使用Keycloak作为认证授权服务器
Spring Boot + Shiro整合
创建一个SpringBoot项目整合MyBatis,Thymeleaf,SpringMVC等并创建相关的配置文件和Service逻辑
Java鱼头
2022/12/01
3651
Spring Security OAuth2实现单点登录
在本教程中,我们将讨论如何使用 Spring Security OAuth 和 Spring Boot 实现 SSO(单点登录)。
朝雨忆轻尘
2019/06/18
2.6K0
Keycloak简单几步实现对Spring Boot应用的权限控制
我们在上一篇初步尝试了keycloak,手动建立了一个名为felord.cn的realm并在该realm下建了一个名为felord的用户。今天就来尝试一下对应的Spring Boot Adapter,来看看keycloak是如何保护Spring Boot应用的。
码农小胖哥
2021/07/22
2.3K0
重磅推荐!开源身份认证神器:KeyCloak!
安装&初始化 下载 http://www.keycloak.org/downloads.html 笔者下载的是“Standalone server distribution” 。 安装&启动 安装Keycloak非常简单,步骤如下: 解压下载下来的安装包 将目录切换到KEYCLOAK_PATH/bin ,其中KEYCLOAK_PATH是您Keycloak的根目录 执行./standalone.sh ,即可启动Keycloak,如需后台运行,则执行./standalone.sh & 。 初始化 启动后,访问
程序猿DD
2023/02/24
6.8K0
重磅推荐!开源身份认证神器:KeyCloak!
使用Spring Boot实现用户认证和授权
在现代Web应用中,用户认证和授权是必不可少的功能。它们确保只有经过验证的用户才能访问应用,并根据用户的角色和权限进行相应的操作。Spring Boot通过集成Spring Security,提供了强大的安全功能,简化了用户认证和授权的实现。本文将详细探讨如何使用Spring Boot实现用户认证和授权,并提供具体的代码示例和应用案例。
E绵绵
2024/06/23
4510
shiro与Spring Boot 整合
框架整合 创建模块 添加依赖  <parent> <groupId>org.springframework.boot</groupId>
一个风轻云淡
2023/10/15
1830
shiro与Spring Boot 整合
SpringBoot与安全(Spring Security)
​ SpringSecurity 是针对 Spring 项目的安全框架,也是 Spring Boot 底层安全模块的技术选项。他可以实现强大的 web 安全控制。对于安全控制,我们需要引入 spring-boot-starter-securiy 模块。
OY
2022/03/12
7560
SpringBoot与安全(Spring Security)
【Spring Boot】013-Spring Boot整合Shiro环境搭建
訾博ZiBo
2025/01/06
1090
【Spring Boot】013-Spring Boot整合Shiro环境搭建
springboot 整合 springSecurity 和shiro
SpringSecurity 安全简介 1、在 Web 开发中,安全一直是非常重要的一个方面。安全虽然属于应用的非功能性需求,但是应该在应用开发的初期就考虑进来。如果在应用开发的后期才考虑安全的问题,就可能陷入一个两难的境地:一方面,应用存在严重的安全漏洞,无法满足用户的要求,并可能造成用户的隐私数据被攻击者窃取;另一方面,应用的基本架构已经确定,要修复安全漏洞,可能需要对系统的架构做出比较重大的调整,因而需要更多的开发时间,影响应用的发布进程。因此,从应用开发的第一天就应该把安全相关的因素考虑进来,并在整个应用的开发过程中。
kirin
2021/04/30
1.1K0
spring security 实践 + 源码分析
Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。它提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了Spring IoC,DI(控制反转Inversion of Control ,DI:Dependency Injection 依赖注入)和 AOP(面向切面编程)功能,为应用系统提供声明式的安全访问控制功能,减少了为企业系统安全控制编写大量重复代码的工作。当前版本为 5.0.5。
大道七哥
2019/09/10
5830
spring security 实践 + 源码分析
Spring Boot (十四): Spring Boot 整合 Shiro-登录认证和权限管理
这篇文章我们来学习如何使用 Spring Boot 集成 Apache Shiro 。安全应该是互联网公司的一道生命线,几乎任何的公司都会涉及到这方面的需求。在 Java 领域一般有 Spring Security、 Apache Shiro 等安全框架,但是由于 Spring Security 过于庞大和复杂,大多数公司会选择 Apache Shiro 来使用,这篇文章会先介绍一下 Apache Shiro ,在结合 Spring Boot 给出使用案例。
纯洁的微笑
2019/08/13
1.3K0
73. Spring 和 Spring Boot 的区别是什么?
对于 Spring和 SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习 SpringBoot的我当时也是一头雾水,随着经验的积累、我慢慢理解了这两个框架到底有什么区别,相信对于用了 SpringBoot很久的同学来说,还不是很理解 SpringBoot到底和 Spring有什么区别,看完文章中的比较,或许你有了不同的答案和看法!
用户11332765
2024/11/01
1150
Springboot整合shiro_spring boot框架介绍
Shiro是一款安全框架,主要的三个类Subject、SecurityManager、Realm
全栈程序员站长
2022/10/03
3250
Springboot整合shiro_spring boot框架介绍
spring boot整合shiro_Spring框架介绍及使用
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/10/04
4390
spring boot整合shiro_Spring框架介绍及使用
Spring Boot 3.1 中如何整合Spring Security和Keycloak
在今年2月14日的时候,Keycloak 团队宣布他们正在弃用大多数 Keycloak 适配器。其中包括Spring Security和Spring Boot的适配器,这意味着今后Keycloak团队将不再提供针对Spring Security和Spring Boot的集成方案。
程序猿DD
2023/08/09
1.2K0
Spring Boot 3.1 中如何整合Spring Security和Keycloak
springboot安全之整合spring security实现(只有登录才有权限、不同用户显示不同内容、记住我)
1、新建一个springboot项目,选择web、thymeleaf、spring security
西西嘛呦
2020/08/26
8890
springboot安全之整合spring security实现(只有登录才有权限、不同用户显示不同内容、记住我)
Springboot整合shiro
官网:Apache Shiro | Simple. Java. Security.
chao超的搬运文章
2023/10/15
7030
Springboot整合shiro
oidc auth2.0_使用Spring Security 5.0和OIDC轻松构建身份验证「建议收藏」
“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕? 尝试使用Okta API进行托管身份验证,授权和多因素身份验证。
全栈程序员站长
2022/09/27
3.7K0
什么是Spring Security?具有哪些功能?
本篇将带你快速了解什么是Spring Security,通过入门案例以及相关原理和类的分析让你快速入门。
reload
2024/04/16
4821
什么是Spring Security?具有哪些功能?
推荐阅读
相关推荐
Spring Security 中使用Keycloak作为认证授权服务器
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验