使用keycloak SSO来串联相关的服务

背景

最近打算整一些服务,但是每个服务都有自己的登录方式。目前在某四字大厂上班,公司都是通过SSO来串联各个系统。大体评估了下,还是考虑基于开源的keycloak来把我这些服务的登录都串联起来。

keycloak配置&部署

keycloak当前大版本为26,使用的JDK版本为21。可以直接使用OpenJDK:https://jdk.java.net/archive/ 由于21已经是比较早的版本,因此要从archive这边才能下载到。

keycloak默认使用的是PG,不过不想重新搭建一个PG,因此还是使用mariaDB,需要提前创建好数据库以及授权对应的用户名及密码,后面配置需要写入。反向代理则使用nginx:

export JAVA=/opt/jdk/jdk-21.0.2/bin/java # 使用JDK 21

./bin/kc.sh build --db=mariadb --spi-x509cert-lookup-provider=nginx # 执行一些build配置

./bin/kc.sh show-config # 查看对应的配置

修改对应的一些配置项

db=mariadb
db-username=keycloak
db-password=xxxx # xxxx为对应的密码
# 设置数据库连接为 mariadb, keycloak为对应的数据库
db-url=jdbc:mariadb://localhost/keycloak

# 设置证书 这里使用letsencrypt签发的证书 xxx.com 换为自己的域名
https-certificate-file=/etc/letsencrypt/live/xxx.com/fullchain.pem
https-certificate-key-file=/etc/letsencrypt/live/xxx.com/privkey.pem

proxy=reencrypt
proxy-headers=xforwarded # 挂nginx后 设置下 header,nginx对应 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

hostname=https://xxx.xxx.com # 修改为自己SSO的域名
hostname-admin=https://adm-xxx.xxx.com # 对应管理控制面的域名

https-port=9091 # 如果不使用默认的端口 可以配置下https的端口号

# 开启文件日志及配置路径
log=file
log-file=/opt/log/keycloak.log

改完后,可以使用./bin/kc.sh show-config查看配置是否正确。

使用临时管理员创建启动并创建管理员账号:

./bin/kc.sh start --bootstrap-admin-username tmpadm --bootstrap-admin-password yourpass

跑完之后,登录对应的之前配置的域名,先使用临时管理员的账号及密码登录,并创建一个新的账号,新账号授予管理员权限,后续相关操作都走新的管理员账号来配置。

添加到systemd(keycloak.service):

[Unit]
Description=Keycloak Application Server
After=network.target

[Service]
Type=simple
#User=ping
#Restart=on-failure
Restart=always
RestartSec=5s

KillSignal=SIGTERM
KillMode=process
SendSIGKILL=no
SuccessExitStatus=143

# 设置JAVA的路径
Environment=JAVA=/opt/jdk/jdk-21.0.2/bin/java

# 启动脚本
ExecStart=/opt/app/keycloak-26.0.6/bin/kc.sh start --optimized
StandardOutput=null

[Install]
WantedBy=multi-user.target

设置启动项:

systemctl enable /opt/app/keycloak.service
systemctl start keycloak.service

没什么大问题,上面这些跑完后,keycloak就跑起来了。

创建新的realm

可以把语言调整为中文

创建一个新的realm
登录界面设置中文支持
email可以设置下方便通知支持;events开启用户事件+管理员事件,设置下超时时间。方便后续出问题定位
安全配置不可少,防止被人穷举攻击

stirling pdf配置SSO

最近刚好要用到PDF工具,加上stirling-pdf的SSO配置其实很简单,所以用这个来做例子也合适一些。

首先先创建一个client(ID就叫pdf好了)

记得设置Valid redirect URIs确保正确可用
跨域也可以设置下,整体安全性高一些

创建完成客户端后,我们用docker的形式来启动stirling-pdf

#!/bin/bash

D=/opt/app/stirling-PDF

docker run -d -p 172.17.0.1:9001:8080 \
	--restart=always \
	-v ${D}/trainingData:/usr/share/tessdata \
	-v ${D}/configs:/configs \
	-v ${D}/log:/logs \
	-v ${D}/customFiles:/customFiles \
	-e INSTALL_BOOK_AND_ADVANCED_HTML_OPS=false \
	-e LANGS=zh_CN.UTF-8 \
	-e DOCKER_ENABLE_SECURITY=true \
	-e SECURITY_ENABLELOGIN=true \
	-e SECURITY_OAUTH2_ENABLED=true \
	-e SECURITY_OAUTH2_AUTOCREATEUSER=true \
	-e SECURITY_OAUTH2_PROVIDER="keycloak" \
	-e SECURITY_OAUTH2_ISSUER="https://xxx.xxx.com/realms/myrealm" \
	-e SECURITY_OAUTH2_CLIENTID="pdf" \
	-e SECURITY_OAUTH2_CLIENTSECRET="CLIENTSECRET" \
	--name stirling-pdf \
	stirlingtools/stirling-pdf:latest

https://xxx.xxx.com/realms/myrealm 其中 xxx.xxx.com对应自己搭建的sso的域名,myrealm对应上面创建的新的realm。SECURITY_OAUTH2_CLIENTID上面已经固定是pdf了,创建完成client后,可以到Client Secret复制下对应的密码。这样stirling-pdf运行后,则开启了SSO的登录能力:

选择『通过单点登录登录』

当然,前提还是需要在keycloak新创建的realm创建新的用户,如果对应用户可以成功登录。那么则说明对应配置已经成功配置了。

转载请注明: 转载自elkPi.com

本文链接地址: 使用keycloak SSO来串联相关的服务

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

Scroll to top