s-HR 单点登录及调OSF原创
金蝶云社区-云社区用户4eh7396
云社区用户4eh7396
60人赞赏了该文章 2.4万次浏览 未经作者许可,禁止转载编辑于2024年11月08日 17:31:48
summary-icon摘要由AI智能服务提供

本文介绍了调用s-HR的OSF接口的单点登录方式及相关配置。包括两种登录方式:一是通过SHRClient和OSFWSClient类封装的方法调用OSF接口,支持直接登录和通过LtpaToken免密登录;二是通过EAS portal或s-HR页面进行第三方页面跳转登录。同时提供了相关代码示例和配置说明。


调用s-HR的OSF接口必须先单点登录,目前有两种登录方式。下面描述两种登录方式,同时提供封装了两种登录方式的集成依赖包(文末附件中包含.net和php语言单点登录案例有社区提供,仅供参考)



一、调用OSF

A. 单点登录配置

image.png


说明,如果现场的环境没有OTP设置相关内容,请更新对应版本核心平台补丁,各个版本的补丁说明,

https://vip.kingdee.com/knowledge/specialDetail/489865178981146880?category=604393439668264960&productLineId=10&lang=zh-CN

image.png

(如果无法安装补丁,密钥信息请到服务器上,产品安装目录\eas\server\profiles\server*\config\portalConfig\LtpaToken.properties文件中查看)其中 otp.domino.secret的值就是当前环境的密钥


SSO数据中心:选中需要做单点登录的数据中心
登录认证器:此处仅供查看,目前s-HR提供通过OTP认证的单点登录认证方式
启用白名单拦截:勾选之后会启用白名单校验规则,如果第三方地址没有配置在白名单中可能会apusic拦截
白名单地址:在启用白名单之后,此处填写第三方地址,域名或者IP都可
webservice开启安全模式:支持会话粘贴,集群环境需要勾选保证webservice单点登录正常。

  • 注意:配置修改完成之后需要重启服务才能生效。OTP认证配置是实时生效的

B.调用OSF接口

代码示例

import com.kingdee.shr.api.Response;
import com.kingdee.shr.api.SHRClient;
    public class SSOTest{    
        public static void main(String[] args) throws Exception{
        String SHR_LOCAL = "http://127.0.0.1:6888/shr";
        
        //OSF名称,注意是名称不是编码
        String serviceName = "getAccountService";
        SHRClient client = new SHRClient();        
        //调用OSF所需要的参数
        Map<String,Object>  param = new HashMap<String,Object>();
        
        Response res = client.executeService(SHR_LOCAL ,serviceName,param);
        System.out.println(res.getData());
    }
}
  • 此处依赖shr_sso_client.jar

  • client.executeService()方法中已经默认封装好了登录、调用OSF和登出的方法,返回的res结果就是OSF的结果,所以不需要另外登录。该方法中默认使用了user用户做单点登录,所以系统中的user用户不能被禁用或者删除


如果想通过webservice调用OSF,需要确认s-HR是否已经部署了WSOSFWebserviceFacade?wsdl,可通过地址http://127.0.0.1:6888/ormrpc/services/WSOSFWebserviceFacade?wsdl确认。如果没有可部署下文附件中的私包。

webservice单点登录调用OSF代码示例

import com.kingdee.shr.api.OSFWSClient;
import com.kingdee.shr.osf.webservice.client.UserInfo;

    public class SSOTest{    
    public static void main(String[] args) throws Exception{
    
        String SHR_LOCAL = "http://127.0.0.1:6888/shr"; 
               
        //OSF名称,注意是名称不是编码
        String serviceName = "getAccountService";         
        //调用OSF所需要的参数
        Map<String,Object>  param = new HashMap<String,Object>();
        OSFWSClient client = new OSFWSClient(); 
               
        //webservice登录系统的用户信息
        UserInfo userInfo=new UserInfo();
        userInfo.setDcName("数据中心ID");//数据中心ID可在管理控制台中查看,为数据中心代码
        userInfo.setLanguage("L2");//多语言,L1,L2,L3
        userInfo.setUserName("username");//用户名
        userInfo.setPassword("password");//用户密码
        userInfo.setSlnName("eas");//固定值eas
        userInfo.setDbType(1);//数据库类型,0-SQL Server, 1-Oracle, 2-DB2
        
        String res = client.proceedOSF(SHR_LOCAL,serviceName,param,userInfo);
        System.out.println(res);
    }
}
  • 此处依赖shr_sso_client.jar

  • client.proceedOSF()方法中封装好了登录、调用OSF和登出的方法,res就是OSF的结果,不需要另外登录

webservice中还一种免密登录的方式,但是需要确认系统中是否存在这种登录方法,可通过地址http://127.0.0.1:6888/ormrpc/services/EASLogin?wsdl确认,查看是否存在loginByLtpaToken。
参考代码如下

import com.kingdee.shr.api.OSFWSClient;
import com.kingdee.shr.osf.webservice.client.UserInfo;
import com.kingdee.eas.cp.eip.sso.ltpa.LtpaTokenManager;

public class SSOTest{    
    public static void main(String[] args) throws Exception{
    
         String SHR_LOCAL = "http://127.0.0.1:6888/shr";        
        
        //OSF名称,注意是名称不是编码
        String serviceName = "getAccountService";         
        //调用OSF所需要的参数
        Map<String,Object>  param = new HashMap<String,Object>();
        OSFWSClient client = new OSFWSClient();        
        
        //webservice登录系统的用户信息
        UserInfo userInfo=new UserInfo();
        userInfo.setDcName("数据中心ID");//数据中心ID可在管理控制台中查看,为数据中心代码
        userInfo.setLanguage("L2");//多语言,L1,L2,L3
        userInfo.setUserName("username");//用户名
        
        //配置文件路径,该配置文件需与s-HR服务端的一个配置文件内容保持一致,后续有详解
        String configFile = "LtpaToken.properties";//configFile是指LtpaToken.properties配置文件的路径
        //根据密钥生成的密码串
        String password = LtpaTokenManager.generate("username",configFile).toString();
        userInfo.setPassword(password);//生成的密码串
        
        userInfo.setSlnName("eas");//固定值eas
        userInfo.setDbType();//数据库类型  2-Oracle,3-SQL Server, 5-PostgreeSQL, 11-DM(达梦), 12-KingBase, 13-GuessDB
        
        String res = client.proceedOSFByLtpa(SHR_LOCAL,serviceName,param,userInfo);
        System.out.println(res);
    }
}
  • 此处依赖shr_sso_client.jar、kingdee_Ltpa.jar和LtpaToken.properties

  • client.proceedOSF()方法中封装好了登录、调用OSF和登出的方法,res就是OSF的结果,不需要另外登录

  • 注意:此处的LtpaToken.properties文件必须与服务端{EAS-HOME}/eas/server/profiles/server(1-n)/config/portalConfig/LtpaToken.properties的配置文件中的domino.secret内容保持一致,这是生成密码的密钥串。如果是多个实例,每个实例的该文件都必须一致。


二、第三方页面跳转

A. 走EAS页面【通过EAS portal跳转到shr,如果目标地址是跳转到shr页面,不建议使用改方案,建议使用下面

走s-HR页面的方案】

参考地址:

http://127.0.0.1:6888/portal/index2sso.jsp?username=username&password=password&redirectTo=redirectTo

代码示例

import java.net.URLEncoder;
import com.kingdee.eas.cp.eip.sso.ltpa.LtpaTokenManager;
import com.kingdee.eas.cp.eip.sso.ltpa.LtpaToken;

    public class SSOTest{    
        public static void main(String[] args) throws Exception{        
               //s-HR地址
        String SHR_LOCAL = "http://127.0.0.1:6888/shr/home.do";        
        //登录用户名
        String username="user";        
        //配置文件路径,该配置文件需与s-HR服务端的一个配置文件内容保持一致,后续有详解
        String configFile = "LtpaToken.properties";//configFile是指LtpaToken.properties配置文件的路径
        //登录成功之后重定向的地址,需要编码一次
        String redirectTo = URLEncoder.encode(SHR_LOCAL);        
        //根据密钥生成的密码串
        String password = LtpaTokenManager.generate(username,configFile).toString();
        
        String url = "http://127.0.0.1:6888/portal/index2sso.jsp?username="+username+"&password="+password+"&redirectTo="+redirectTo;
        System.out.println(url);
    }
}
  • 此处依赖kingdee_Ltpa.jar和LtpaToken.properties

  • 如果是多语言环境,需跳转到其他的语言环境,请在将url改成http://127.0.0.1:6888/portal/index2sso.jsp?locale=L2&username=username&password=password&redirectTo=redirectTo,增加参数locale,值可为L1、L2或L3

  • 注意:此处的LtpaToken.properties文件必须与服务端{EAS-HOME}/eas/server/profiles/server(1-n)/config/portalConfig/LtpaToken.properties的配置文件中的domino.secret内容保持一致,这是生成密码的密钥串。如果是多个实例,每个实例的该文件都必须一致。


B.走s-HR页面


参考地址:

http://127.0.0.1:6888/shr/OTP2sso.jsp?username=username&password=password&userAuthPattern=OTP&isNotCheckRelogin=true&redirectTo=redirectTo

import java.net.URLEncoder;
import com.kingdee.shr.sso.client.ltpa.LtpaTokenManager;

    public class SSOTest{    
        public static void main(String[] args) throws Exception{        
        //s-HR地址
        String SHR_LOCAL = "http://127.0.0.1:6888/shr/home.do";        
        //登录用户名
        String username="user";        
        //登录成功之后重定向的地址,需要编码一次
        String redirectTo = URLEncoder.encode(SHR_LOCAL);        
        //根据密钥生成的密码串
        String password = LtpaTokenManager.generate(username,LtpaTokenManager.getDefaultLtpaConfig(), "OTP").toString();
        
        String url = "http://127.0.0.1:6888/shr/OTP2sso.jsp?username="+username+"&password="+password+"&userAuthPattern=OTP&isNotCheckRelogin=true&redirectTo="+redirectTo;
        System.out.println(url);
    }
}
  • 此处依赖shr_sso_client.jar,jar包中包含配置文件LtpaToken.properties

  • 如果是多语言环境,需跳转到其他的语言环境,请在将url改成http://127.0.0.1:6888/shr/OTP2sso.jsp?locale=L2&username=username&password=password&userAuthPattern=OTP&isNotCheckRelogin=true&redirectTo=redirectTo,增加参数locale,值可为L1、L2或L3

  • 注意:此处的LtpaToken.properties文件必须与服务端{EAS-HOME}/eas/server/profiles/server(1-n)/config/portalConfig/LtpaToken.properties的配置文件中的otp.domino.secret内容保持一致,这是生成密码的密钥串。如果是多个实例,每个实例的该文件都必须一致。


web-demo压缩文件中提供了部署在第三方的页面,如果直接部署的话需要按以下操作完成基础配置,涉及到的主要文件列表如下:

  • 配置文件:shr-ssoClient.properties

  • 依赖的jar包:shr_sso_client.jar

  • jsp页面:loginhr.jsp、sso2hrUrl.jsp

  • js:shr.window.js

1. 修改文件shr-ssoClient.properties

#s-HR地址
server.url=http://127.0.0.1:6888
#这里是固定值,无需修改
server.path=/shr/OTP2sso.jsp
#认证方式,默认为OTP,无需修改
auth.pattern=OTP
#获取用户名的实现类全路径,下一步会描述
userNameBuilder=ssoShrLogin.ShrLogin

2. 实现com.kingdee.shr.sso.client.user.IUserNameBuilder接口,此处实现后在shr_sso_client.jar中是通过反射去获取用户名的,可通过shr_sso_client.jar中的com.kingdee.shr.sso.client.util.SSOUtil.getUserName()看到。

默认示例代码如下

import com.kingdee.shr.sso.client.user.IUserNameBuilder;

public class DefaultUserNameBuilder implements IUserNameBuilder { 
    
    public String getUserName(HttpServletRequest request) {            
    //此处写从第三方获取登录s-HR用户名的逻辑,并返回用户名
          Object userName = request.getSession().getAttribute("username");           
          return (String) (userName != null ? userName : request.getSession().getAttribute("userName"));
     }
}


调试流程如下
loginhr.jsp-->shr.window.js-->sso2hrUrl.jsp-->com.kingdee.shr.sso.client.util.SSOUtil.generateUrl
图标赞 60
60人点赞
还没有人点赞,快来当第一个点赞的人吧!
图标打赏
0人打赏
还没有人打赏,快来当第一个打赏的人吧!