本文介绍了调用s-HR的OSF接口的单点登录方式及相关配置。包括两种登录方式:一是通过SHRClient和OSFWSClient类封装的方法调用OSF接口,支持直接登录和通过LtpaToken免密登录;二是通过EAS portal或s-HR页面进行第三方页面跳转登录。同时提供了相关代码示例和配置说明。
调用s-HR的OSF接口必须先单点登录,目前有两种登录方式。下面描述两种登录方式,同时提供封装了两种登录方式的集成依赖包(文末附件中包含.net和php语言单点登录案例有社区提供,仅供参考)
一、调用OSF
A. 单点登录配置
说明,如果现场的环境没有OTP设置相关内容,请更新对应版本核心平台补丁,各个版本的补丁说明,
https://vip.kingdee.com/knowledge/specialDetail/489865178981146880?category=604393439668264960&productLineId=10&lang=zh-CN
(如果无法安装补丁,密钥信息请到服务器上,产品安装目录\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
.net和php调用OSF(包含webservice).zi …(255.22KB)
shr-sso-Java-SDK.zip(6.18MB)
金蝶s-HR Cloud 2024 二次开发培训课程-核心平 …(9.66MB)
推荐阅读