超级详细的 Docker Desktop 安装 Keycloak

news/2024/10/22 14:31:12/

一、Keycloak 简介

收先先來看一下Keycloak的基本資訊:

  • 名稱: Keycloak
  • 開發使用的程式語言: Java
  • 公用: 單點登入驗證與授權工具
  • 許可協議: Apache License 2.0
  • 公開倉庫: https://github.com/keycloak/keycloak
  • 官方網站: https://www.keycloak.org
  • 撰寫當下最新版本: 15.0.2 (2021年8月20日)

Keycloak是拿來做什麼的?

首先,他是一個單點登入(Single Sign On, SSO)系統服務。換句話說如果「快速開始」所展示的,他可以協助你驗證身份與管理會話(Session)。
除此之外,他可以嫁接許多現有的驗證系統,支援LDAP、keyberos。

在这里插入图片描述
此外支援多種社交登入(Social Login)。

在这里插入图片描述
以及支援多個標準協議,包含 OAuth 2.0 、 OpenID 和 saml 。 且支援授權服務。

在这里插入图片描述

關於Keycloak

起初會看到 Keycloak 是因爲,當時在思考一個授權設計的相關軟體開發問題。然後授權又與驗證不是那麼容易分開來看。
找著找著就發現Keycloak這蠻有去的玩具。雖然文件上有些過時,但功能齊全、更新更讓我意外。

2020年底、2021年初,剛接觸時才12版,一部分OAuth的Flow也沒有實現。半年才過去一些,現在不但有了,主板號更是直接跳到15版。

  • 2021年7月30 發佈 15.0.0 版
  • 2021年8月7日 發佈 15.0.1 版
  • 2021年8月20日 發佈 15.0.2 版

在这里插入图片描述

一、安装Docker

Docker Desktop 安装使用教程 点击查看

二、安装 KeyCloak

镜像地址: https://hub.docker.com/r/jboss/keycloak/

在这里插入图片描述

1、安装 jboss/keycloak 镜像

 docker pull jboss/kaycloak

在这里插入图片描述
在这里插入图片描述

2、启动 jboss/keycloak 镜像

参考启动命令 如下命令将启动一个新的容器,需要启动已有的容器,请使用 docker start 《container_id》

# jboss/keycloak 
docker run -p 8082:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin jboss/keycloak
​
# quay.io/keycloak  v19.0.1
docker run -p 9080:9080 -p 9443:9443 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin -e KC_HTTP_PORT=9080 -e KC_HTTPS_PORT=9443 -d quay.io/keycloak/keycloak:19.0.1 start-dev 

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

然后重新启动容器:

docker restart <CONTAINER>

在这里插入图片描述

在这里插入图片描述

三、使用 KeyCloak

1、访问 jboss/keycloak

  • 1、ping通server ip
  • 2、browser访问: http://127.0.0.1:8082/
  • 3、初始用户名和密码都是admin(启动时指定).

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2、使用 jboss/keycloak

我们使用的时候需要创建一个realm,创建realm简单,设置一个名称即可。
点击左上角的 Master,在弹出下拉框中点击 Create Realm 按钮。
在这里插入图片描述
在这里插入图片描述

2.1、Realm公开配置

可以通过如下地址获取指定realm的openid配置
注意:keycloak:18.0.0之前的版本,url 需要添加 auth 路径

# kc 18.0.0
${KC_ADDR}/realms/${KC_REALM}/.well-known/openid-configuration# before kc 18.0.0
${KC_ADDR}/auth/realms/${KC_REALM}/.well-known/openid-configuration

Example:http://127.0.0.1:8082/realms/MVNO/.well-known/openid-configuration
在这里插入图片描述

返回一个json数据,包括grant_types_supported等

2.2、Create Client

创建 Realm之后最重要的就是创建 Client ,不同类型的Client对 OAuth Grant Flow 支持有所差异。
主要配置和 Client Type 和 Client ID,前者决定授权方式,后者是后端程序配置连接地址时要配置。

在左侧菜单栏中选择Clients 选项卡。然后点击右侧的添加按钮。

在这里插入图片描述

输入客户端名称,然后点击保存。

在这里插入图片描述

然后,在添加成功后的跳转到的页面找到Valid Redirect URIs ,在这里将配置我们的spring boot 应用的网址。在本示例中,spring boot应用将会跑在8081端口上。所以地址应设置为http://localhost:8081。随后保存。

在这里插入图片描述

Client authentication: 如果打开,则client的access type为credentials,那么连接此client需要 client-secret参数;否则access type为public,不需要client-secret。
不同access type的client支持的Authentication flow有些差异。

Authentication flow:

  • Standard flow: oauth2 的 Authorization Code Flow。
  • Direct access grant: oauth2的 Password Flow。

在这里插入图片描述
创建client之后,需要配置一些参数,如“Valid redirect URIs ”等参数。
如果使用基于重定向的 Authentication flow,keycloak接收到redirect_uri参数时,检测其是否与当前client配置的 Valid redirect_uri 一致。不符合则会提示

在这里插入图片描述

Client secret

在这里插入图片描述

Advanced TAB

如配置access_token 存活时长等

在这里插入图片描述

2.3、Create Roles

在左侧菜单栏中选择Roles 选项卡。然后点击右侧的添加按钮。
   输入用户名,然后保存。

在这里插入图片描述

Create User

登录的用户来自这里;如果有额外的用户数据数据库,可以配置 User federation 。
注意:需要登录的用户需先在数据库中配置角色(前端无角色会报错)。
创建用户

1、 在左侧菜单栏中选择Users 选项卡。然后点击右侧的添加按钮。

在这里插入图片描述

2、输入用户名添加用户

在这里插入图片描述

3、添加成功后,单击Credentials 选项卡,设置登录密码。

在这里插入图片描述

4、添加成功后,单击Role Mappings 选项卡,给用户设置角色。

在这里插入图片描述

5、开启用户注册(可选)

在左侧菜单栏中选择Realm Settings 选项卡。然后按照如图所示进行操作。
   这样在KeyCloak的登录页面就会增加注册按钮。

在这里插入图片描述

四、Springboot 整合 KeyCloak

1、创建一个Spring Boot 应用

添加以下依赖

<dependencyManagement><dependencies><dependency><groupId>org.keycloak.bom</groupId><artifactId>keycloak-adapter-bom</artifactId><version>17.0.1</version><type>pom</type><scope>import</scope></dependency></dependencies>
</dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><dependency><groupId>org.keycloak</groupId><artifactId>keycloak-spring-boot-starter</artifactId><version>17.0.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

2、Controller

@Controller
public class MyController {@GetMapping("/customers/he")@ResponseBodypublic Map he(Principal principal){Map<String, String> map = new HashMap<>();map.put("username",principal.getName());return map;}}

3、SecurityConfig

@KeycloakConfiguration
public class SecurityConfig extends KeycloakWebSecurityConfigurerAdapter {
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {KeycloakAuthenticationProvider keycloakAuthenticationProvider= keycloakAuthenticationProvider();keycloakAuthenticationProvider.setGrantedAuthoritiesMapper(new SimpleAuthorityMapper());auth.authenticationProvider(keycloakAuthenticationProvider);
}@Bean
@Override
protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
}@Override
protected void configure(HttpSecurity http) throws Exception {super.configure(http);http.authorizeRequests()//注意这句 这个user角色是我们在Keycloak中创建并分配给用户的, 只有用户拥有该role时,用户才能访问对应的资源.antMatchers("/customers/*").hasRole("user") .anyRequest().permitAll();
}

4、KeycloakConfig

@Configuration
public class KeycloakConfig {@Beanpublic KeycloakSpringBootConfigResolver keycloakConfigResolver() {return new KeycloakSpringBootConfigResolver();}
}

5、application.yml

server:port: 8081 #与keycloak中配置的一致keycloak:auth-server-url: http://localhost:8080  #KeyCloak地址realm: MyRealm  #realm名称resource: spring-app #client名称public-client: trueprincipal-attribute: preferred_usernamessl-required: external


http://www.ppmy.cn/news/1259746.html

相关文章

TS版LangChain实战:基于文档的增强检索(RAG) | 京东云技术团队

LangChain LangChain是一个以 LLM &#xff08;大语言模型&#xff09;模型为核心的开发框架&#xff0c;LangChain的主要特性&#xff1a; 可以连接多种数据源&#xff0c;比如网页链接、本地PDF文件、向量数据库等允许语言模型与其环境交互封装了Model I/O&#xff08;输入…

如何设置不同的网页标题(react)

通常&#xff0c;当我们写一个h5或者网站时&#xff0c;需要根据页面的业务来自定义网页标题。 这个本来是在入口html文件中设置的&#xff0c;但唯一。 <head><meta charset"UTF-8" /><!-- <link rel"icon" type"image/svgxml&qu…

【数据结构】——二叉树特点

前言&#xff1a;我们前面已经了解了二叉树的一些概念&#xff0c;那么我们今天就来了解下二叉树的遍历实现和一些性质。 二叉树的遍历方式有三种&#xff1a;前序&#xff0c;中序&#xff0c;后序。 前序&#xff1a;先根节点&#xff0c;再左子树&#xff0c;最后右子树。 中…

Java利用UDP实现简单的双人聊天

一、创建新项目 首先创建一个新的项目&#xff0c;并命名。 二、实现代码 import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.net.*; import java.io.IOException; import java.lang.String; public class liaotian extends JFrame{ pri…

【LeetCode 0125】【双指针】有效回文

题目 https://leetcode.com/problems/valid-palindrome/ 题解 双指针&#xff1a;左指针右移过程时跳过非法字符&#xff0c;右指针左移时跳过非法字符。 如果左指针大于等于右指针&#xff0c;表示有效回文&#xff1b;如果两指针所对应的字符如果不等&#xff0c;则不是有…

利用python编写后端程序 通用代码详解 项目实现

前言 最近自己正好有时间&#xff0c;想要自己搭建微信小程序&#xff0c;也正好记录一下自己的搭建过程和内容。 搭建准备工作 这里我使用的时pycharm编辑器。在后端开发中&#xff0c;我们需要三个库&#xff1a; import pymysql from flask import request, Fl…

batch_size太大和太小的优缺点分别是什么?

在深度学习的实验当中&#xff0c;我们通常回去设置batch_size&#xff0c;那batch_size开的太大和太小分别会为我们带来什么样的优缺点呢&#xff1f; 批处理大小过大&#xff1a; 优点&#xff1a; 训练速度较快&#xff1a;大批次可以充分利用硬件加速器&#xff08;如GP…

云上守沪 | 云轴科技ZStack成功实践精选(上海)

为打造国际数字之都&#xff0c;上海发布数字经济发展“十四五”规划&#xff0c;围绕数字新产业、数据新要素、数字新基建、智能新终端等重点领域&#xff0c;加强数据、技术、企业、空间载体等关键要素协同联动&#xff0c;加快进行数字经济发展布局&#xff1b;加快基础软件…