自定义登陆逻辑原创
金蝶云社区-Lento
Lento
3人赞赏了该文章 191次浏览 未经作者许可,禁止转载编辑于2024年04月29日 18:26:02

    项目中,客户提了一个需求,需要在页面上登陆的时候先去AD域校验,最开始的时候想的是直接启用苍穹的AD域登陆设置

    但是呢,客户的AD域又很个性化,有用前缀、后缀的,目前还不支持,而且客户想要的效果是先去AD域登陆,如果不成功,再进行苍穹的登陆。
    所以就想了一个办法,干预苍穹的登陆逻辑,就衍生出了以下的内容,通过filter干预登陆的接口,优先执行我们的逻辑,不成功,再去执行苍穹的标准登陆。
参考资料如下:
https://vip.kingdee.com/article/318801864630167296?productLineId=29&isKnowledge=2&lang=zh-CN

并附上代码:

ext-filter.xml

<?xml version="1.0" encoding="UTF-8" ?>
<web-app>


    <filter>
        <filter-name>MyLoginFilter</filter-name>
        <filter-class>digi.alm.SdxcLoginFilter</filter-class>
        <filter-order>49996</filter-order>
        <filter-mapping>
            <url-pattern>/auth/yzjlogin.do</url-pattern>
        </filter-mapping>
    </filter>

</web-app>




package digi.alm;

import kd.bos.actiondispatcher.ActionUtil;
import kd.bos.context.RequestContext;
import kd.bos.dc.api.model.Account;
import kd.bos.dc.utils.AccountUtils;
import kd.bos.lang.Lang;
import kd.bos.logging.Log;
import kd.bos.logging.LogFactory;
import kd.bos.login.LoginClientEnum;
import kd.bos.login.lang.LoginLangUtils;
import kd.bos.login.user.LoginUserService;
import kd.bos.login.utils.*;
import kd.bos.session.SessionManager;
import kd.bos.util.NetAddressUtils;
import kd.bos.util.RevProxyUtil;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * </p>
 * description
 * <p>
 *
 * @author wentao.liu01@foxmail.com 2024/04/28 10:10
 */
public class SdxcLoginFilter implements Filter {

    private static final Log LOGGER = LogFactory.getLog(SdxcLoginFilter.class);

    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest)servletRequest;
        HttpServletResponse response = (HttpServletResponse)servletResponse;

        //===============================================================================
        //  第三方登陆
        //===============================================================================


        // 如果第三方登陆成功
        if(true){


            LoginUtils.handleGenernal(request, response);

            Lang lang = LoginLangUtils.getLoginLanguage(request);
            String requestURI = request.getRequestURI();
            LOGGER.info("Got requestUri: {}.", requestURI);

            // 初始化RC
            String accountId = LoginUtils.getParamerter(request, "accountId");
            String redirect = LoginUtils.getParamerter(request, "redirect");
            String tenantId = RevProxyUtil.getTenantCode(request);

            String userPassword = LoginUtils.getDecryptedPassword((HttpServletRequest) servletRequest, accountId);

            RequestContext rc = RequestContext.create();
            rc.setAccountId(accountId);
            rc.setTenantId(tenantId);
            RequestContext.set(rc);
            Account currentCenter = AccountUtils.getAccountById(accountId);

            // 获取用户信息 各类型自行选择
            // Map<String, String> user = LoginUserService.getErpUserInfoByUserId(currentCenter, userId, lang.name());
            Map<String, String> user = LoginUserService.getErpUserInfoByPhone(currentCenter, "xxxxxxx", lang.name());

            // 创建session
            String sessionId = SessionUtils.createNewSession(request, response, currentCenter, lang, NetAddressUtils.getRemoteHost(request), user, LoginClientEnum.WEB);
            SessionManager.writeCookieData(request, response, "KHRSESSIONID" + tenantId, sessionId);

            if (StringUtils.isEmpty(redirect)) {
                redirect = "index.html";
            } else if (LoginUtils.isSelfEnvironmentNew(redirect, request, response) && !SecurityUtils.checkXss(redirect)) {
                String qs = request.getQueryString();
                if (qs != null) {
                    redirect = qs.replace("redirect=", "");
                }
            } else if (StringUtils.isNotEmpty(request.getParameter("isMobile"))) {
                redirect = "mobile.html";
            } else {
                redirect = "index.html";
            }
            redirect = URLUtils.securityFilterRedirectUrl(redirect);
            Map<String, Object> map = new HashMap();
            map.put("errorcode", 0);
            map.put("RedirectURL", redirect);
            map.put("username", user.get("username"));
            String time = JSONUtils.toString(map);
            ActionUtil.writeResponseJson(servletResponse, time);
        }else{
            filterChain.doFilter(servletRequest, servletResponse);
        }
    }
    
    public void init(FilterConfig filterConfig) throws ServletException {

    }
    
    public void destroy() {
    }
}


赞 3