通过keycloak 来实现gerrit的用户管理。主要有几个步骤,1.安装gerrit,2.安装gerrit oauth 插件,3.配置gerrit . 4.创建keycloak的配置,添加realm,client,user ,三个,5.重启gerrit 测试。
17版本不一样的是,需要开启oauth,服务器增加前缀。
准备
Keycloak之17.0.1 版本安装-yellowcong
实现效果
下图可以看到,登录测试,可以正常的登录到gerrit服务上, 美滋滋啊
设置keyloak 启动带前缀
./bin/ start-dev --http-relative-path /auth --http-port 8084
- 1
如果不增加 --http-relative-path /auth
这个参数,会导致gerrit插件登陆登陆失败,404 ,由于新版本的oauth路径,去掉了/auth前缀。
auth接入地址,未配置--http-relative-path /auth
前
实际请求的地址
gerrit 安装
gerrit 的官网 /
#下载gerrit
#java 11
wget /gerrit-3.6.
#java8
#wget /gerrit-2.11.
wget /gerrit-3.0.
#初始化gerrit,回输入一堆配置,插件全安装
java -jar gerrit-3.0. init -d ./gerrit
#下载gerrit-oauth-provider 插件 ,如果不下载插件,就会导致oauth 功能使用不了
cd gerrit/plugins
#oauth官网
/davido/gerrit-oauth-provider/
wget //davido/gerrit-oauth-provider/releases/download/v3.0.0/
#重启gerrit
./bin/ restart
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
keycloak 配置
1.创建realm
realm相当于是一家公司了,不同的realm不受影响,做到了租户隔离了。
设置realm的名称为 test,后面oauth 是要用到的
切换realm,默认情况下,是在Master 这个下面,可以切换到新建立的realm里
2. 创建client
1.点击Clients
菜单
2.点击Create
按钮
3.设置Client Id
(为应用的名称)
4.点击保存,创建gerrit 客户端成功
3. 设置oauth( 没有这个特殊的设置)
1.点击菜单Clients
2.列表中,找到创建的gerrit
客户端,并点击【Edit】,进入gerrit客户端的编辑
新版本的KeyCloak ,默认是没有【Credentials】的tab选项的。需要修改Access Type
,
需要配置Client Protocol
为 openid-connect
, Access Type
为 confidential
,然后点击保存,就出来了
保存以后,【Credentials】的tab选项就出来了
4.并配置redirect url
配置【Valid Redirect URIs 】地址为 gerrit的地址加oauth ,【http://172.16.161.131:8085/oauth】和【http://172.16.161.131:8085/】,不然就会登录失败,未授权。
5. 创建用户
这个用户是realm级别的,而不是应用级别的。
添加用户信息,(密码得单独设置),对于这个gerrit 必须把邮箱,First Name ,LastName ,Username 四个参数,必须都设置上, gerrit 会根用 FisrtName + LastName 拼接为用户名称,邮箱会作为gerrit的必须参数。
创建用户的话,设置用户名密码,
这样就创建了一个admin 用户了
6. 获取secret
点击【Credentials】,查看Secret的密码信息。
gerrit 配置
修改 etc/ 配置 ,logoutUrl 登出之后,跳转地址,
[auth]
type = OAUTH
gitBasicAuthPolicy = HTTP
logoutUrl = http://172.16.161.131:8084/auth/realms/test/protocol/openid-connect/logout?redirect_uri=http://172.16.161.131:8085/
[plugin "gerrit-oauth-provider-keycloak-oauth"]
root-url = http://172.16.161.131:8084
realm = test
client-id = gerrit
client-secret = 86y03fXxiZ7NKzPa6Dfkvg3fDjTmHUyw
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
完整配置如下
[gerrit]
basePath = git
canonicalWebUrl = http://172.16.161.131:8085/
serverId = 1c02d061-9636-48bc-b49b-d5ea4f0f0c6d
[container]
javaOptions = "-Dflogger.backend_factory=.log4j.Log4jBackendFactory#getInstance"
javaOptions = "-Dflogger.logging_context=#getInstance"
user = root
javaHome = /usr/local/jdk1.8.0_241/jre
[index]
type = LUCENE
[auth]
type = OAUTH
gitBasicAuthPolicy = HTTP
logoutUrl = http://172.16.161.131:8084/auth/realms/test/protocol/openid-connect/logout?redirect_uri=http://172.16.161.131:8085/
[receive]
enableSignedPush = false
[sendemail]
smtpServer = localhost
[sshd]
listenAddress = *:29418
[httpd]
listenUrl = http://*:8085/
[cache]
directory = cache
[plugin "gerrit-oauth-provider-keycloak-oauth"]
root-url = http://172.16.161.131:8084
realm = test
client-id = gerrit
client-secret = 86y03fXxiZ7NKzPa6Dfkvg3fDjTmHUyw
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
配置完事后,重启gerrit服务,生效
#重启gerrit
./bin/ restart
- 1
- 2
登录测试
下图可以看到,登录测试,可以正常的登录到gerrit服务上, 美滋滋啊
常见问题
1. OAuth service provider wasn’t installed
错误详细信息如下,导致问题的原因是由于没有安装oauth插件导致的
Caused by: javax.servlet.ServletException: OAuth service provider wasn't installed
at com.google.gerrit.httpd.auth.oauth.OAuthWebFilter.pickSSOServiceProvider(OAuthWebFilter.java:180)
at com.google.gerrit.httpd.auth.oauth.OAuthWebFilter.init(OAuthWebFilter.java:74)
at com.google.inject.servlet.FilterDefinition.init(FilterDefinition.java:110)
at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:98)
at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:232)
at org.eclipse.jetty.servlet.FilterHolder.initialize(FilterHolder.java:136)
at org.eclipse.jetty.servlet.ServletHandler.lambda$initialize$0(ServletHandler.java:750)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
可以去oauth官网 : /davido/gerrit-oauth-provider/ 下载对应版本的 包,我这边是gerrit-3.0. 版本的,所以下载的是 v3.0.0的。
#进入插件目录
cd plugins
#下载插件,然后重启gerrit即可
wget //davido/gerrit-oauth-provider/releases/download/v3.0.0/
- 1
- 2
- 3
- 4
- 5
2. Invalid parameter: redirect_uri
导致的原因,是配置【* Valid Redirect URIs 】有问题
修改以一下客户端的【* Valid Redirect URIs 】 为gerrit 的地址【http://172.16.161.131:8085/oauth】
3. Response doesn’t contain email field
出现下面这个问题的原因,是创建用户的时候,没有添加邮箱,导致gerrit用户需要关联邮箱,关联是失败。
2022-09-30 10:40:54,133] [HTTP-108] WARN org.eclipse.jetty.server.HttpChannel : /oauth java.io.IOException: Response doesn't contain email field
[2022-09-30 10:40:54,136] [HTTP-108] ERROR com.google.gerrit.pgm.http.jetty.HiddenErrorHandler : Error in GET /oauth?state=XM8ESw3uCvQ9h8_pNl8ufKUToJ4LxRl8a4rNe76DI_k&session_state=3bd2e5df-9afb-4a59-9960-0e7c9acfad6a&code=a0d44146-8007-4bd7-bf93-1dda445a01f2.3bd2e5df-9afb-4a59-9960-0e7c9acfad6a.d32ae9c8-d5d3-4fa3-8543-766f805cb202
java.io.IOException: Response doesn't contain email field
at com.googlesource.gerrit.plugins.oauth.KeycloakOAuthService.getUserInfo(KeycloakOAuthService.java:100)
at com.google.gerrit.httpd.auth.oauth.OAuthSession.login(OAuthSession.java:105)
at com.google.gerrit.httpd.auth.oauth.OAuthWebFilter.doFilter(OAuthWebFilter.java:105)
at com.google.gerrit.httpd.RunAsFilter.doFilter(RunAsFilter.java:120)
at com.google.gerrit.httpd.AllRequestFilter$FilterProxy$1.doFilter(AllRequestFilter.java:133)
at com.google.gerrit.httpd.AllRequestFilter$FilterProxy.doFilter(AllRequestFilter.java:135)
at com.google.gerrit.httpd.RequestMetricsFilter.doFilter(RequestMetricsFilter.java:57)
at com.google.gerrit.httpd.RequestContextFilter.doFilter(RequestContextFilter.java:69)
at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:121)
at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:133)
at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1610)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
参考文章
/davido/keycloak-gerrit-oauth-provider/blob/master/resources/
https:///article/