扩展用户自定义登录系统 |
SuperMap iPortal 不仅允许用户快速接入 CAS、LDAP、Keycloak 等通用的第三方登录系统,还支持通过扩展开发的方式集成用户自定义的登录系统。
扩展用户自定义登录系统的流程一般包括:对接 iPortal 第三方登录接口、配置自定义登录系统、启用自定义登录系统等。iPortal 产品包中提供了一套简单的示例代码供您参考,示例代码位于 %SuperMap iPortal_HOME%\samples\code\loginExtensions 目录下。
iPortal 提供了部分开放的第三方登录接口,便于用户扩展自定义的登录系统,下面简要介绍如何对接 iPortal 第三方登录接口:
一、准备开发环境
请在扩展开发前准备好 Java 开发环境,安装 Java 开发工具( IDE),并配置好项目管理工具 Maven。
二、导入扩展开发工程
将示范代码中的 http-redirect-authenticator-impl 文件夹(位于 %SuperMap iPortal_HOME%\samples\code\loginExtensions 目录下)导入 IDEA 中,然后修改其中的 pom.xml 文件以指定项目依赖 jar 包(http-redirect-authenticator-api.jar) 的路径,该 jar 包位于 %SuperMap iPortal_HOME%\webapps\iportal\WEB-INF\lib 路径下,您只需将下面粗体部分修改为实际使用的 iPortal 版本号并写入实际的 jar 包路径即可:
...
<version>X.X.X</version>
...
<systemPath>{http-redirect-authenticator-api-jar-path}/http-redirect-authenticator-api-X.X.X.jar</systemPath>
...
修改 pom.xml 文件后,使用 Maven 命令读取项目文件(pom.xml),拉取项目的依赖。
三、对接自定义登录系统
根据您需要扩展的自定义登录系统的业务逻辑,修改示例代码 SampleSSOAuthenticator.java 和 SampleSSOParam.java 。首先,您可以统一修改示例代码的类名和包名以满足实际的业务需求;其次,您需要根据自定义登录系统中实现的回调逻辑和回调参数对示例代码进行相应的修改。具体包括:
该示例代码用于定义登录系统的回调地址(Callback URL)中携带的参数(加粗代码所示),您可以根据需要继续添加回调地址中的 URL 参数。
package com.supermap.iportal.extension.authsample;
import com.supermap.iportal.extapi.httpredirectauthorizer.AuthParam;
public class SampleSSOParam extends AuthParam {
private static final long serialVersionUID = 1330131184881057L;
// TODO 补充iPortal需要解析的 Callback URL 中的 URL参数,如果没有需要额外解析的参数可以忽略。
public String ticket;
}
注意:不能将 token 添加为参数。这是由于 iPortal 中使用了 token 作为用户身份验证机制的令牌,此处再添加 token 作为回调参数可能会与 iPortal 中的令牌产生冲突。
该示例代码用于定义登录系统的认证和回调逻辑,您可以修改示例代码以匹配自定义登录系统的业务逻辑。以下代码为您需要重点关注的部分:1.“sampleguid”为返回自定义登录系统唯一标识的客户端 ID,需根据业务实际情况进行修改;2.加粗部分代码用于向登录认证服务器发送请求,通过参数中的 ticket 换取用户身份信息,如果您的登录系统中增加了其他的回调参数,还需在此处添加相应的回调逻辑。
...
public String getIdentity() {
// TODO 将“sampleguid”修改为返回自定义登录系统唯一标识的客户端ID
return "sampleguid";
}
...
public User authenticateOnCallback(SampleSSOParam param) throws LoginException {
String ticket = param.ticket;
User currentLoginUser = new User();
// TODO 增加逻辑,通过票据向认证服务器发认证请求获取用户身份信息
currentLoginUser.name = "test";
return currentLoginUser;
}
四、将修改后的示例代码打包
示例代码修改完成并通过调试后,即可执行 maven package 命令将项目打包。
完成自定义登录系统与 iPortal 第三方登录接口的对接后,需按照以下步骤配置自定义登录系统:
1. 将示范代码 ( 位于 %SuperMap iPortal_HOME%\samples\code\loginExtensions ) 中的 extensions 目录及子目录拷贝到 %SuperMap iPortal_HOME%\webapps\iportal\WEB-INF 目录下,然后在 WEB-INF\extensions\custom_302_authentication 路径下编辑 authenticator.xml 文件,按照示例配置 authenticator 类的加载路径和登录地址,相应的代码如下:
...
<bean id="authenticator" class="com.supermap.iportal.extension.authsample.SampleSSOAuthenticator">
<property name="loginUrl" value="http://loginSystem/loginpage"></property>
</bean>
2. 将修改示例代码后生成的 jar 包复制到 %SuperMap iPortal_HOME%\webapps\iportal\WEB-INF\extensions\custom_302_authentication\lib 目录中。
3. 在自定义登录系统中,配置登录认证成功后的回调地址,示例如下:
http://{ip}:{port}/iportal/authentication/302basedauthenticator/sampleguid/callback?ticket=*********
以上配置完成后,您就可以启用自定义登录系统了。
在【SuperMap iPortal 安装目录】\webapps\iportal\WEB-INF 文件夹下的 iportal.xml 配置文件中,通过编辑 <authenticationDelegation> 节点的内容启用自定义登录系统,并设置登录页面的展示方式,支持以 iframe 弹窗的形式展示。关于节点内容的说明如下:
<authenticationDelegation>
<enable>true</enable>
<iframeable> false </iframeable>
<loginPopup>
<width>600</width>
<height>500</height>
</loginPopup>
</authenticationDelegation>
保存后,启动 iPortal,即可使用自定义登录系统进行登录操作。