本章节重点讲述如何单点登录到第三方系统,适用于从乐创者门户/报表/跨设备表单/大屏等产品页面点击事件打开第三方系统页面,通过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