本章节重点讲述如何单点登录到第三方系统,适用于从乐创者门户/报表/跨设备表单/大屏等产品页面点击事件打开第三方系统页面,通过sso机制把当前乐创者中的用户身份传(用户ID等)递给第三方系统。
JDK17以下引入本文档附件中的lcz-auth-center-client-1.3.0.rar解压缩后的jar文件。
JDK17及以上引入本文档附件中的lcz-auth-center-client-2.0.0.rar解压缩后的jar文件。
一、配置sso过滤器
1.1 过滤器配置方式
1.1.1 方式一、通过web.xml配置
适用于传统的Web应用。
可参考附件中的 webDemo.rar。
<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>注意:上面的”
/* “请按照实际接口地址配置。
1.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 LczSsoFilterRegisterConfig() {
initParam = new LczSsoFilterParam();
}
@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;
}
}具体实现请参考本文附件中springBootDemo中的具体代码。
1.2 过滤器中获取用户信息
1.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() {
}
}1.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": "" //用户访问第三方系统时的第三方账号名称
}
}二、类OAuth2方式
其原理为通过回调地址中的ticket+accessToken换取登录用户信息。
其过程大致为:
- 从认证中心回调地址中获取ticket
- 通过systemCode等信息调用“3.1 获取系统访问凭证”接口
- 通过上面获取的ticket和accessToken,调用“3.2 获取登录用户信息”接口,即可获取第三方系统对应的用户账号和登录用户基本信息。
三、开放api
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": "错误码"
}3.2 获取登录用户信息接口
Request Method:POST
Content-Type:application/json
Request URL:{http}://{ip}:{port}/api/lczAuthCenter/sso/ticket/get/user请求头
| 参数名 | 是否必需 | 说明 |
|---|---|---|
| accessToken | 是 | 第三方系统访问凭证 |
请求体
{
"ticket": "sso 授权码,一般会带在SSO跳转地址后面,例如:http://目标服务ip:port/api/sso/login?ticket=xxxxxx"
}响应结果
成功:
{
"success": true,
"content": {
"userInfo": {
"userName":"第三方系统的用户账号名",
"loginInfo":"认证中心中登录用户的基本信息,如:姓名等"
}
},
"msg": "",
"code": ""
}失败:
{
"success": false,
"msg": "错误信息",
"code": "错误码"
}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": "错误码"
}四、附件说明
lcz-auth-center-client-1.3.0.jar:jdk1.8环境编译的客户端jar,基于jdk17以下环境的第三方系统可引入此包;
lcz-auth-center-client-2.0.0.jar:jdk17环境编译的客户端jar,基于jdk17及以上环境的第三方系统可引入此包;
warDemo.rar: 标准war应用示例工程。
springBoot.rar:基于SpringBoot的示例工程。
附件
作者:柳杨 创建时间:2026-07-14 10:22
最后编辑:柳杨 更新时间:2026-09-07 20:28
最后编辑:柳杨 更新时间:2026-09-07 20:28
———— 本文档对您有帮助吗?或有错误,恳请 反馈 ————
