Jira/Bitbucket/Confluence使用CAS完成SSO

Jira/Bitbucket/Confluence

项目代码托管,协作,问题追踪三件套。这三个软件同时使用时可以将用户统一托管给Jira管理.
但是一般公司会有自己的账户体系并且使用了 CAS 作为统一登录管理.
这个时候就可以将这三个系统的登录以及用户管理交由CAS来完成

CAS

由耶鲁大学开源的一套单点登录系统
基于SAML协议来做SSO认证. CAS 可以支持多种认证协议.只需要做下简单的配置就行

开始配置(以Jira为例)

假设jira的url为 http://jira.xyz327.cn
CAS的url为 http://cas.xyz327.cn

配置CAS支持SAML协议

CAS 支持 SAML 具体请参考官方文档

增加SAML协议相关依赖

给CAS添加saml相关依赖

1
2
3
4
5
6
7
8
9
10
11
<!--saml 协议-->
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-saml-idp-metadata-rest</artifactId>
<version>${cas.version}</version>
</dependency>
<dependency>
<groupId>org.apereo.cas</groupId>
<artifactId>cas-server-support-saml-idp</artifactId>
<version>${cas.version}</version>
</dependency>

给CAS增加IDP的描述文件

SAML默认配置是在 /etc/cas/saml 目录下,也可以使用 来手动指定 SAML配置目录
在spring-boot配置文件中增加以下配置

1
2
3
4
5
6
7
8
9
10
11
12
cas:
authn:
saml-idp:
metadata:
location: saml
entity-id: http://cas.xyz327.cn/idp
scope: http://cas.xyz327.cn
response:
credential-type: x509
attribute-query-profile-enabled: true
server:
prefix: http://cas.xyz327.cn

此时访问 http://cas.xyz327.cn/idp/metadata 就可以看到CAS作为SAMLIdentity Provider的metaData信息

配置Jira

给Jira安装SSO插件

插件管理里面搜索SAML Single Sign On
SAML Single Sign On (SSO) Jira SAML SSO
其他两个系统的插件也叫这个名字

配置SSO插件信息

  1. 点击页面左边菜单的SAML Single Sign On
  2. 在弹出框中Idp Type选择 Other SAML Identity Provider, NameDescription按自己需求填写.点击下一步
  3. 显示Jira作为SP(Service Provide)的相关配置,记录好Metadata URL的地址.在这里应该是http://jira.xyz327.cn/plugins/servlet/samlsso/metadata。点击下一步
  4. 下拉选择I have a metadata URL,然后填入配置CAS的地址http://cas.xyz327.cn/idp/metadata,点击Accpet all,点击import,点击下一步
  5. 选择匹配JirauserId的属性.使用默认的,点击下一步
  6. 选择同步用户到jira的方式,我这边选择Update Form SAML-Attributes,从登陆用户的信息中创建用户
  7. 勾选create New UserUpdate non-SAML Provisioned Users,Directory for New Users一栏选择Jira Internal Directory, Full Name Attribute输入{username},Email Attribute输入{email}.下拉到Group Settings->User Groups 点击Add one 输入jira-software-users. 点击下一步
  8. 点击Skip test & configure manually
  9. 点击Redirection并勾选上Enable SSO Redirect
  10. 点击右上角的Save Settings

给CAS添加 Jira 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
{
"@class": "org.apereo.cas.support.saml.services.SamlRegisteredService",
"serviceId": "http://jira\\.xyz327\\.cn.*",
"name": "JIRASAMLService",
"id": 3,
"evaluationOrder": 10,
"metadataLocation": "http://jira.xyz327.cn/plugins/servlet/samlsso/metadata",
"attributeReleasePolicy": {
"@class": "org.apereo.cas.services.ReturnAllowedAttributeReleasePolicy",
"allowedAttributes": [
"username",
"email"
]
}
}

完成配置

此时访问 http://jira.xyz327.cn 就会自动跳转到 http://cas.xyz327.cn
完成登陆后,如果是第一次登陆就会自动创建用户

后记

对于Bitbucket 在Directory for New Users无法选择Jira Internal Directory.多以对于Bitbucket 可以选择不同用户信息.这样就会导致如果用户第一次登陆是登陆bitbucket的话那就会出现找不到用户的错误。可以在PageTemplate里面增加错误提示要求用户第一次登陆时需要先登录Jira/Confluence

贴一个错误的 errorPageTemplate

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
<html>
<head>
<title>SAML Single Sign On failed</title>
$webResourceManager.requireResource("$pluginproperties.pluginkey:resources")
<meta name="decorator" content="atl.general">
</head>
<body class="aui-page-focused aui-page-medium" >
<div class="aui-page-panel">
<div class="aui-page-panel-inner">
<section class="aui-page-panel-content">
<h1>SAML Single Sign On failed</h1>
<div>Please contact your administrator #if($tracker) and provide the tracker-id <b>$tracker</b> #end or log in at the <a href="$loginurl">login page</a>.</div>
#if($userid)
<div class="aui-message error">$userid could not be authorized. This userid is unknown or the user does not have sufficient permissions.</div>
#end
#if($message)
<div class="aui-message error">$message</div>
<!-- 这里提示用户需要先登录jira -->
<div class="aui-message error">如果提示找不到用户请先登录<a href="http://jira.xyz327.cn/"><b>jira</b></a></div>
#end
#if($stacktrace)
<a id="show-stacktrace-trigger" data-replace-text="Hide Stack Trace" class="aui-expander-trigger button" aria-controls="stacktrace">Show Stack Trace</a>
<div class="aui-expander-content" id="stacktrace">$stacktrace</div>
#end
</section>
</div>
</div>
</body>
</html>