- 一、准备工作
- 1.1 部署乐创者开发平台
- 1.2 部署统一认证微服务
- 1.3 在数据库中创建标准用户体系表和第三方系统相关表
- 1.4 导入“统一认证中心管理”应用
- 1.5 开启镜像配置
- 二、建设标准用户体系的组织用户
- 2.1 在智能门户中创建单位【可选】
- 2.2 创建标准用户体系部门/用户
- 三、乐创者登录接入标准用户认证
- 四、导入第三方系统组织/用户数据
- 4.1 注册第三方系统
- 4.2 导入第三方系统的用户、部门数据
- 4.3 映射标准用户和第三方用户
- 五、单点登录到其他第三方系统
- 5.1 单点登录到其他乐创者服务
- 5.2 单点登录到第三方系统
- 5.2.1 配置sso过滤器
- 5.2.1.1 方式一、通过web.xml配置
- 5.2.1.2 方式二、通过springboot注册过滤器
- 5.2.2 过滤器中获取用户信息
- 5.2.2.1 方式一、request和session获取用户信息
- 5.2.2.2 方式二、ThreadLocal获取用户信息
- 5.3 开放api
- 5.3.1 获取接口访问凭证
- 5.3.2 用户登录
- 5.3.3 获取第三方系统单点登录的URL
本文档介绍如何通过乐创者统一认证中心集成各类系统,并实现统一单点登录。
一、准备工作
1.1 部署乐创者开发平台
部署参考:乐创者系统部署
本乐创者服务作为登录入口,支持账号、扫码登录等。
1.2 部署统一认证微服务
部署参考:乐创者统一认证中心部署
1.3 在数据库中创建标准用户体系表和第三方系统相关表
按照乐创者统一认证中心概述章节中涉及的内容创建标准用户体系表和第三方系统表。
1.4 导入“统一认证中心管理”应用
系统管理员(administrator)登录智能门户(lczPortal), 导入本文档中的“统一认证中心管理”应用。
导入成功后,修改数据库连接信息,指向标准用户和第三方系统相关表的数据库。
1.5 开启镜像配置

参考:参考镜像配置
二、建设标准用户体系的组织用户
2.1 在智能门户中创建单位【可选】
如果开启了分级管理的,需要先在智能门户的用户管理->部门中创建单位。
2.2 创建标准用户体系部门/用户
可在门户中或“统一认证中心管理”应用中的部门管理表单中创建标准用户体系中的部门、角色、用户等。
三、乐创者登录接入标准用户认证
我们可以借助于某一套乐创者平台作为账号、钉钉/浙政钉扫码的统一登录入口。
配置方式:
系统管理员(administrator)登录智能门户后,在系统选项->用户认证页面中,将“登录认证”选择为“第三方登录”,如下图所示:

将本文档附件中的lcz-auth-center-client-2.0.0.jar、lcz-auth-center-bridge-2.0.0.jar拷贝到 /lczServer/WEB-INF/lib目录下,其中,需要调整lcz-auth-center-bridge-2.0.0.jar包中根目录下“lcz_auth_center_bridge.properties”文件的配置。
login_system_code=lczV800 login_system_secret=6270935d14bd4cbb8c649f03d3a20486 tenant=default auth_server_domain=http://127.0.0.1:18000/lczServer其中,
login_system_code:配置为第三方系统中注册系统的唯一标识;
login_system_secret:配置为第三方系统中注册系统的密钥;
tenant:默认为default,如果是多租户模式,则设置为租户标识名称;
auth_server_domain:配置为认证服务器的地址;
注意:注册系统时,选择大致如下:
更换完成后,需要重启服务。
四、导入第三方系统组织/用户数据
4.1 注册第三方系统
通过“统一认证中心管理”应用中的“第三方系统注册”表单注册第三方系统。
4.2 导入第三方系统的用户、部门数据
可利用数据开发平台或其他方式导入第三方系统的用户、组织(可选,建议导入,方式用户映射)
4.3 映射标准用户和第三方用户
五、单点登录到其他第三方系统
5.1 单点登录到其他乐创者服务
将本文档附件中的lcz-auth-center-client-2.0.0.jar、lcz-auth-center-bridge-2.0.0.jar拷贝到 /lczServer/WEB-INF/lib目录下;
在待单点登录到的乐创者服务中,添加一个外部认证类:

类名:com.datanew.privilege.LczAuthCenterPrivilege第三方系统中注册一个应用,设置大致如下:

注意:PC端入口中配置的privilege_type的值,就是上面添加的外部认证类的名称。/lczServer/WEB-INF/web.xml中增加以下过滤器配置:
<filter> <filter-name>SSO Authentication Filter</filter-name> <filter-class>com.datanew.authcenter.filter.AuthenticationFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <!--统一认证中心服务地址--> <param-value>http://172.16.23.5:18000/lczServer</param-value> </init-param> <init-param> <param-name>serverName</param-name> <!-- 第三方系统服务地址 --> <param-value>http://172.16.12.244:8080</param-value> </init-param> <!-- 第三方系统在统一认证中心注册的信息 --> <init-param> <param-name>systemCode</param-name> <param-value>lcz_report_demo</param-value> </init-param> <init-param> <param-name>systemSecret</param-name> <param-value>68a1ab5cac9649d6b953af3467757194</param-value> </init-param> <!-- tenant 不配置, 默认default--> <init-param> <param-name>tenant</param-name> <param-value>default</param-value> </init-param> </filter> <filter> <filter-name>SSO Validation Filter</filter-name> <filter-class>com.datanew.authcenter.filter.BaseTicketValidationFilter</filter-class> <!-- 当前系统在统一认证中心注册的信息 --> <init-param> <param-name>systemCode</param-name> <param-value>lcz_report_demo</param-value> </init-param> </filter> <filter> <filter-name>SSO User Info Thread Local Filter</filter-name> <filter-class>com.datanew.authcenter.filter.TicketUserInfoThreadLocalFilter</filter-class> </filter> <!-- sso登录需配置拦截地址 --> <filter-mapping> <filter-name>SSO Authentication Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>SSO Validation Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>SSO User Info Thread Local Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>配置完成后,重启服务;
将该乐创者服务的用户导入到第三方用户表中,并于标准用户建立映射关系。
5.2 单点登录到第三方系统
5.2.1 配置sso过滤器
5.2.1.1 方式一、通过web.xml配置
<filter> <filter-name>SSO Authentication Filter</filter-name> <filter-class>com.datanew.authcenter.filter.AuthenticationFilter</filter-class> <init-param> <param-name>casServerUrlPrefix</param-name> <!--统一认证中心服务地址--> <param-value>http://172.16.23.5:18000/lczServer</param-value> </init-param> <init-param> <param-name>serverName</param-name> <!-- 第三方系统服务地址 --> <param-value>http://172.16.12.244:8080</param-value> </init-param> <!-- 第三方系统在统一认证中心注册的信息 --> <init-param> <param-name>systemCode</param-name> <param-value>lcz_report_demo</param-value> </init-param> <init-param> <param-name>systemSecret</param-name> <param-value>68a1ab5cac9649d6b953af3467757194</param-value> </init-param> <!-- tenant 不配置, 默认default--> <init-param> <param-name>tenant</param-name> <param-value>default</param-value> </init-param> </filter> <filter> <filter-name>SSO Validation Filter</filter-name> <filter-class>com.datanew.authcenter.filter.BaseTicketValidationFilter</filter-class> <!-- 当前系统在统一认证中心注册的信息 --> <init-param> <param-name>systemCode</param-name> <param-value>lcz_report_demo</param-value> </init-param> </filter> <filter> <filter-name>SSO User Info Thread Local Filter</filter-name> <filter-class>com.datanew.authcenter.filter.TicketUserInfoThreadLocalFilter</filter-class> </filter> <!-- sso登录需配置拦截地址 --> <filter-mapping> <filter-name>SSO Authentication Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>SSO Validation Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>SSO User Info Thread Local Filter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>5.2.1.2 方式二、通过springboot注册过滤器
@Configuration
@ConfigurationProperties("lcz.sso.filter.init-param")
public class LczSsoFilterParam {
private String casServerUrlPrefix;
private String systemCode;
private String systemSecret;
private String tenant;
private String serverName;
}@Configuration
public class LczSsoFilterRegisterConfig {
private LczSsoFilterParam initParam;
public FilterRegisterConfig(LczSsoFilterParam initParam){
this.initParam = initParam;
}
@Bean
public FilterRegistrationBean<Filter> authenticationFilter(){
FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new AuthenticationFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.addInitParameter("casServerUrlPrefix", initParam.getCasServerUrlPrefix());
registrationBean.addInitParameter("serverName", initParam.getServerName());
registrationBean.addInitParameter("systemCode", initParam.getSystemCode());
registrationBean.addInitParameter("systemSecret", initParam.getSystemSecret());
registrationBean.addInitParameter("tenant", initParam.getTenant());
return registrationBean;
}
@Bean
public FilterRegistrationBean<Filter> baseTicketValidationFilter(){
FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new BaseTicketValidationFilter());
registrationBean.addUrlPatterns("/*");
registrationBean.addInitParameter("systemCode", initParam.getSystemCode());
return registrationBean;
}
@Bean
public FilterRegistrationBean<Filter> ticketUserInfoThreadLocalFilter(){
FilterRegistrationBean<Filter> registrationBean = new FilterRegistrationBean<>();
registrationBean.setFilter(new TicketUserInfoThreadLocalFilter());
registrationBean.addUrlPatterns("/*");
return registrationBean;
}
}5.2.2 过滤器中获取用户信息
5.2.2.1 方式一、request和session获取用户信息
public class GetUserInfoFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest)servletRequest;
HttpSession session = request.getSession(false);
TicketUserInfoResponse ticketUserInfo = (TicketUserInfoResponse)(session == null ? request.getAttribute(AbstractCasFilter.CONST_CAS_USER_INFO) : session.getAttribute(AbstractCasFilter.CONST_CAS_USER_INFO));
//构建本地会话
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}5.2.2.2 方式二、ThreadLocal获取用户信息
public class GetUserInfoFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
TicketUserInfoResponse ticketUserInfo = TicketUserInfoHolder.getTicketUserInfo();
//构建本地会话
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
}
}TicketUserInfoResponse数据结构:
{
"tokenInfo": {
"userAccessToken": "",
"userLoginToken": ""
},
"userInfo": {
"userName": "" //用户访问第三方系统时的第三方账号名称
}
}5.3 开放api
5.3.1 获取接口访问凭证
Request Method:POST
Content-Type:application/json
Request URL:{http}://{ip}:{port}/api/lczAuthCenter/accessToken/get请求体
{
"systemCode": "第三方系统唯一标识",
"systemSecret": "第三方系统secret",
"tenant": "租户标识",
"clientCode": "客户端唯一编码,用于第三方系统为集群时区分客户端,同一个客户端下面accessToken是唯一的,如果为空使用clientIp为clientCode"
}响应结果
成功:
{
"success": true,
"content": {
"accessToken": "第三方系统访问凭证,有效期为7200秒(2小时),有效期内重复获取会返回新的访问凭证",
"expireIn": 7200L //访问凭证超时时间,单位秒
},
"msg": "",
"code": ""
}失败:
{
"success": false,
"msg": "错误信息",
"code": "错误码"
}5.3.2 用户登录
5.3.3 获取第三方系统单点登录的URL
Request Method:POST
Content-Type:application/json
Request URL:{http}://{ip}:{port}/api/lczAuthCenter/sso/system3rd/createUrl请求头
| 参数名 | 是否必需 | 是否必需 说明 |
|---|---|---|
| accessToken | 是 | 第三方系统访问凭证 |
| userAccessToken | 是 | 用户令牌 |
请求体
{
"systemCode": "系统唯一编码",
"userName": "标准用户账号名",
"clientType": 0 //客户端类型, 0:pc 1:移动
}响应结果
成功
{
"success": true,
"content": "已经拼接ticket的第三方系统单点登录访问地址",
"msg": "",
"code": ""
}失败:
{
"success": false,
"msg": "错误信息",
"code": "错误码"
}最后编辑:林 更新时间:2026-06-11 18:29
