V56 Portal单点登录及系统集成红皮书.docx
- 文档编号:5919546
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:13
- 大小:21.55KB
V56 Portal单点登录及系统集成红皮书.docx
《V56 Portal单点登录及系统集成红皮书.docx》由会员分享,可在线阅读,更多相关《V56 Portal单点登录及系统集成红皮书.docx(13页珍藏版)》请在冰豆网上搜索。
V56Portal单点登录及系统集成红皮书
Portal单点登录及系统集成红皮书
NC5.6
NC基础技术部
2018-09-21
1.1概念介绍
SSO(Singlesign-on)即单点登录技术。
它是指在多个子系统的大型应用中,用户在子系统之间进行切换时,不需要每次都重新输入用户的身份信息,从而做到一处认证,整个应用系统都能有效识别。
单点登录技术的系统集成功能为当前企事业单位尤其是大型多子系统企业系统集成提供了完美的解决方案。
它使得这些原有系统能够合理的集成起来,对外提供统一的界面风格和唯一的登录入口。
单点登录只是一种功能概念,并没有对具体的实现方式进行定义和限制。
NC-Portal的单点登录方案,就是SSO技术的一种实现方式。
NC-Portal的SSO方案是基于凭证的思想设计。
对于NC-Portal集成的每个第三方系统都有一个制作凭证的页面,该页面用于当前登录的portal用户输入对应的第三方系统的用户信息,在正常情况下,该制作凭证的页面最多出现一次。
当用户输入的第三方系统登录信息进行验证后,会自动在portal系统的数据库中建立一对凭证槽和凭证信息,这对信息记录了portal用户在特定的portal布局和特定的portlet下,与该第三方系统的身份对应关系。
当该用户之后登录portal并进入被集成第三方系统时,portal系统负责获取之前成功建立的对应第三方系统身份信息,并用该身份信息进行第三方系统的身份认证。
这一切的操作对当前登录用户来说都是透明的,他们看到的是没有输入任何身份信息而以正确的身份进入了第三方系统。
另外,在用户每次登录第三方系统时,都会根据第三方系统的要求进行身份认证,因此这个登录过程是安全的。
对于NC-Portal来说,对Web系统的集成提供了完善的支持和解决,对Web系统的集成,目前有大小之分。
集成一个单独的系统如NC、IUFO、BO、OA系统采用单独的一个布局存放(当然,该布局也是由一个portlet组成),这些Web系统称为“大”系统。
另外,还存在一些集成第三方系统的“小”portlet,如NC待办事务Portlet、NC报表Portlet、IUFO报表Portlet等,这些是以“小”Portlet的形式出现的。
他们主要提供一些对集成系统的辅助功能,如对NC待办事务的提取、对IUFO报表信息的提取,这两种方式功能侧重点略有不同。
1.2API介绍
当第三方系统与Portal进行集成时,必须实现Portal要求的单点集成接口
nc.bs.portlet.IWebAppLoginService。
该接口负责完成生成凭证的过程、定制生成凭证所需要用户提供的信息域以及提供用户登录时的转向URL,在制作凭证和提供用户转向URL时需要根据第三方系统的需要进行必要的用户认证。
该方法进行凭证的制作:
publicPtCredentialVOcredentialProcess(HttpServletRequestreq,SSOProviderVOproviderVO)throwsPortletLoginException;
req:
http请求,通过getParameter方法可以获取用户输入的单点登录信息,通过该信息构造凭证。
providerVO:
该系统在sso-provider.xml中配置的单点信息可以从该vo中获取。
该方法获取生成凭证所需用户提供的信息域
publicExtAuthField[]getCredentialFields(HttpServletRequestreq,SSOProviderVOproviderVO,PtUserVOuserVO,PtCredentialVOcredential)throwsPortletLoginException;
req:
http请求,通过getParameter方法可以获取用户输入的单点登录信息。
providerVO:
该系统在sso-provider.xml中配置的单点信息可以从该vo中获取。
userVO:
当前portal用户的信息。
credential:
如果该用户已经拥有登录该系统的凭证信息,可以从该vo中获取原来的凭证信息
该方法获取最终进入系统的url
publicStringgetGateUrl(HttpServletRequestreq,HttpServletResponseres,PtCredentialVOcredential,SSOProviderVOproviderVO)throwsPortletLoginException;
req:
http请求,可以从该请求中获取需要的请求变量值。
credential:
从该凭证vo中获取关联好的凭证信息,可以在返回最终的url前对该信息进行再次的校验。
providerVO:
该系统在sso-provider.xml中配置的单点信息可以从该vo中获取。
该方法用于用户登录信息校验
publicStringverifyUserInfo(HttpServletRequestreq,PtCredentialVOcredentialVO,SSOProviderVOproviderVO)throwsPortletLoginException;
req:
http请求,可以从该请求中获取需要的请求变量值。
credentialVO:
从该凭证vo中获取关联好的凭证信息,可以在返回最终的url前对该信息进行再次的校验。
providerVO:
该系统在sso-provider.xml中配置的单点信息可以从该vo中获取。
该方法用于获取集成系统指定节点的登陆URL
publicStringgetNodeGateUrl(HttpServletRequestreq,HttpServletResponseres,StringnodeId,PtCredentialVOcredential,SSOProviderVOproviderVO)throwsPortletLoginException;
req:
http请求,可以从该请求中获取需要的请求变量值。
credential:
从该凭证vo中获取关联好的凭证信息
providerVO:
该系统在sso-provider.xml中配置的单点信息可以从该vo中获取
nodeId:
指定节点的ID
1.3开发细节说明
在使用NC-Portal集成第三方系统时,主要实现IWebAppLoginService接口,下面详细介绍IWebAppLoginService接口。
1.3.1接口方法实现说明
publicPtCredentialVOcredentialProcess(HttpServletRequestreq,SSOProviderVOproviderVO)throwsPortletLoginException;
该方法用于制作Portal用户和第三方系统用户间的凭证。
由于在getCredentialFields方法中已经指定了登录时需要验证的各个字段,所以在该方法的实现中要获取各个字段的值,代码如下:
PtCredentialVOcredentialVO=newPtCredentialVO();
StringuserId=req.getParameter("userid");
Stringpassword=req.getParameter("password");
credentialVO.setUserid(userId);
credentialVO.setPassword(password);
//用户校验
verifyUserInfo(req,credentialVO,providerVO);
returncredentialVO;
verifyUserInfo(req,credentialVO,providerVO)实现了
publicStringverifyUserInfo(HttpServletRequestreq,PtCredentialVOcredentialVO,SSOProviderVOproviderVO)throwsPortletLoginException接口
该方法用于用户登录信息校验,如果用户登录信息不合法则抛出异常,具体代码如下:
StringregistryUrl=providerVO.getValue("registryUrl");
StringBufferparameters=newStringBuffer("username="+credentialVO.getUserid());
parameters.append("&password="+credentialVO.getPassword());
StringreturnFlag=null;
try{
returnFlag=sysRegiste(parameters.toString(),registryUrl);
}catch(Exceptione){
Logger.error(e,e);
thrownewPortletLoginException(e.getMessage());
}
if(returnFlag!
=null&&returnFlag.equals("failure"))
thrownewPortletLoginException("BO用户验证失败,用户名或密码有误!
");
else
returnreturnFlag;
sysRegiste是个私有方法,我们提供了一种参考实现,可以直接采用。
然后根据是否验证成功返回不同的字符串来处理,如果验证不成功返回字符串”0”,以我们规定的异常抛出,这样会直接在单点登录的界面上显示提示信息,如果验证成功则返回构造好的CredentialVO。
向第三方系统认证地址发送验证信息的参考实现方法如下。
privateStringsysRegiste(Stringparameters,StringregistrUrl)throwsIOException
{
URLpreUrl=newURL(registrUrl);
URLConnectionuc=preUrl.openConnection();
//表明程序必须把名称/值对输出到服务器程序资源
uc.setDoOutput(true);
//表明只能返回有用的信息
uc.setUseCaches(false);
//设置Content-Type头部指示指定URL已编码数据的窗体MIME类型
uc.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
//设置Content-Type头部指示指定URL已编码数据的窗体MIME类型
uc.setRequestProperty("Content-Length",""+parameters.length());
//提取连接的适当的类型
HttpURLConnectionhc=(HttpURLConnection)uc;
//把HTTP请求方法设置为POST(默认的是GET)
hc.setRequestMethod("POST");
//输出内容
OutputStreamos=hc.getOutputStream();
DataOutputStreamdos=newDataOutputStream(os);
dos.writeBytes(parameters);
dos.flush();
dos.close();
//获取对凭证的验证结果
InputStreamis=hc.getInputStream();
StringreturnFlag="";
intch;
while((ch=is.read())!
=-1){
returnFlag+=String.valueOf((char)ch);
}
if(is!
=null)
is.close();
returnreturnFlag;
}
publicExtAuthField[]getCredentialFields(HttpServletRequestreq,SSOProviderVOproviderVO,PtUserVOuserVO,PtCredentialVOcredential)throwsPortletLoginException{
由于第三方系统的登录信息不尽相同,简单的系统只需要用户名/密码,有的系统在登录时可能还需要别的信息,如公司编码等,这个方法用于指定登录时需要用户录入的第三方系统的登录信息,代码实例如下
ExtAuthField[]fields=newExtAuthField[2];
fields[0]=newTextExtAuthField("用户名:
","userid",true);
fields[1]=newPasswordExtAuthField("用户口令:
","password",false);
returnfields;
这样Portal的单点登录框架会自动根据这些指定字段形成统一风格的凭证制作界面。
publicStringgetGateUrl(HttpServletRequestreq,HttpServletResponseres,
PtCredentialVOcredential,SSOProviderVOproviderVO)throws
PortletLoginException
这个方法是真正形成进入第三方系统的最终URL地址。
对于本身有htmlform表单登录的系统,在单点集成时直接利用该系统已有的登录验证逻辑,只是保证将所需的参数传给集成系统即可,代码参考实现如下:
Stringusercode=credential.getUserid();
Stringpassword=credential.getPassword();
//进行credential中的信息校验,保证信息安全
StringreturnFlag=null;
try{
returnFlag=verifyUserInfo(req,credential,providerVO);
}catch(IOExceptione){
Logger.error(e,e);
thrownewPortletLoginException(e.getMessage());
}
if(returnFlag!
=null&&returnFlag.equals("0"))
thrownewPortletLoginException("系统用户名或密码有误!
");
Map
formFieldMap.put("username",usercode);
formFieldMap.put("password",password);
req.getSession().setAttribute("fieldsMap",formFieldMap);
StringfromUrl=“http:
//127.0.0.1/login.jsp”;
req.getSession().setAttribute("form_url",fromUrl);
return"/portal/html/portlets/application/form_view.jsp";
return的jsp是Portal系统规定的框架级jsp,必须这么写,form_url为原来第三方系统登录页面htmlform表单所指向的action地址,往formFieldMap中put进的key值,必须和第三方系统原登录表单的各个字段的key值一样。
如果第三方系统的登录不是基于htmlform表单的形式,类似NC系统,那么代码的参考实现如下:
StringgateUrl=providerVO.getGateUrl();
//用户校验
StringreturnFlag=verifyUserInfo(req,credential,providerVO);
StringrealUrl=gateUrl+returnFlag;
returnrealUrl;
这样只需最终返回进入系统的url即可。
1.3.2Porlet的配置说明
单点集成类型的portlet都需要在portlet.xml进行说明,具体的配置如下:
//pageId的值和
pageId=SysPortlet
//必须和sso-prop.xml中
//Portlet全类名
1.3.3SSO的配置说明
sso-prop.xml中需要是对单点登录系统的描述,指明该系统的单点认证类,登录信息验证地址,登录系统的URL,和系统需要的特定默认配置项等。
这些配置会在portal启动时自动解析形成SSOProviderVO类,从该类中可以获取系统配置的各个单点信息。
一般的配置如下:
//127.0.0.1/verify.jsp
//127.0.0.1/login.jsp
registryUrl为第三方提供的认证jsp地址,
1.3.4认证地址registryUrl的说明
registryUrl是第三方系统提供的对用户登录信息认证的地址,应由第三方系统提供,因为一般的第三方系统肯定都有用户信息验证的方法,所以该文件的实现不需要太多的代码,为了统一,Portal系统建议,第三方系统由于验证不通过返回给认证类的结果为字符串”0”。
这里给出某系统提供的认证代码(bovalidate.jsp)作为实现参考。
<%@pageimport="com.crystaldecisions.sdk.occa.infostore.*,
mon.*,
com.crystaldecisions.sdk.framework.*,
com.crystaldecisions.sdk.occa.security.*,
com.crystaldecisions.sdk.exception.SDKException,
com.crystaldecisions.sdk.occa.managedreports.IReportSourceFactory,
java.util.Locale,
com.crystaldecisions.report.web.viewer.CrystalReportVie
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- V56 Portal单点登录及系统集成红皮书 Portal 单点 登录 系统集成 红皮书