第三方系统单点登录到苍穹平台指定页面原创
金蝶云社区-豹
5人赞赏了该文章 2393次浏览 未经作者许可,禁止转载编辑于2022年05月26日 10:49:24

需求:外部系统需要点击指定链接跳转到苍穹指定的页面查看列表信息,在拿到第三方跳转信息时候需要到第三方系统认证中心鉴权(此处鉴权不做分享)

准备工作:第三方系统用户数据匹配

配置:MC配置,配置第三方系统登录

登录mc,路径:租户列表-选择租户-先取消“启用”-保存--点击数据中心-登录类型配置“第三方认证”-配置“认证插件”路径-启用数据中心-保存

插件地址后文将会提到image.png


插件编写:


package kd.cfjt.service.sso;

import kd.bos.login.thirdauth.ThirdSSOAuthHandler;
import kd.bos.login.thirdauth.UserAuthResult;
import kd.cfjt.util.auth.AuthUserUtil;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

import static kd.bos.login.thirdauth.UserProperType.UserName;


/**
 * @ClassName OtherSysSSOAuth
 * @Author zb
 * @Description TODO
 * @Date 2022/2/21 15:09
 **/
public class OtherSysSSOAuth implements ThirdSSOAuthHandler {


    private static String ERROR_USER = "errorUser";

    private static String SYS_INDEX_URL = "https://cfjt.kdcloud.com/login.html";
    
    /**
     * @Author  zb
     * @Description 该方法是用户没有登录的时候插件需要转移到正确的登录地址
     * @Date 15:10 2022/2/21
     * @Param [request, response, s]
     * @return void
    **/
    @Override
    public void callTrdSSOLogin(HttpServletRequest request, HttpServletResponse response, String s) {
        //用户需要登录的地址
        String loginUrl = SYS_INDEX_URL;
        try {
            response.sendRedirect(loginUrl);
        } catch (IOException e) {

            e.printStackTrace();
        }

    }

    /**
     * @Author  zb
     * @Description 该方法实现第三发插件认证及认证结果的返回
     * @Date 15:10 2022/2/21
     * @Param [httpServletRequest, httpServletResponse]
     * @return kd.bos.login.thirdauth.UserAuthResult
    **/
    @Override
    public UserAuthResult getTrdSSOAuth(HttpServletRequest request, HttpServletResponse response) {

        //此处code为第三方系统提供的相关鉴权码,如果需要接收其他参数也可自行获取
        String code = request.getParameter("code");

        UserAuthResult result=new UserAuthResult();
        result.setSucess(false);
        //这里编写自己的登录逻辑,判断是否登陆成功,并填写正确的返回类型和返回值

        try {
            //去第三方平台获取openid
            String openId = AuthUserUtil.getOpenId(code);
            //去第三方平台获取userInfo,拿到用户名
            String userName = AuthUserUtil.getUserName(openId);

            //测试直接进入通道,此处为方便测试编写的,传入这个code就直接给set一个用户名登录进去了,正式一定记得注释掉
            if(code.equals("zb123")){
                userName = "zhongb";
            }

            if(userName!=null && userName != ERROR_USER){
                //当前返回类型手机,用户名,email,工号
                result.setUserType(UserName);
                result.setUser(userName);
                result.setSucess(true);
            }else{
                response.sendRedirect(SYS_INDEX_URL);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return result;

    }
}


第三方跳转配置:

以跳转到指定列表页面为例:

https://xxxxxx.kdcloud.com/index.html?type=list&formId=bos_list&billFormId=er_layout_dailyreimburse&app=kdem&code=XXXXXXXX


image.png

code:第三方系统传入的,也可自行定义,在插件中接收即可


赞 5