扩展使用自定义的第三方账户 |
SuperMap iServer 提供了 ExtendedUserStorage 接口用于第三方扩展用户的验证,用户通过扩展开发可使 iServer 与已有的认证服务器对接。
com.supermap.services.security.ExtendedUserStorage 接口有如下方法:
当 iserver 中需要验证用户名和密码时,会调用该方法,
该方法获取用户相关的信息,将用户系统的已有的用户信息导入到 iserver 的系统中。这些信息包括:groups(用户所属组),roles(用户所属的角色),description(描述信息)等。
用户在实现 ExtendedUserStorage 接口时,还要加上 @ExtendedUserStorageIdentification("extendID") 注记。
我们通过实现一个简单的扩展,来说明扩展第三方认证的流程。
实现 ExtendedUserStorageSample 类,继承 ExtendedUserStorage 接口,并添加 ExtendedUserStorageIdentificatio 注记如下:
package com.supermap.sample.security;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import org.apache.commons.lang3.StringUtils;
import com.supermap.services.security.ExtendedUserInfo;
import com.supermap.services.security.ExtendedUserStorage;
import com.supermap.services.security.ExtendedUserStorageIdentification;
@ExtendedUserStorageIdentification("userStorageSample")
public class ExtendedUserStorageSample implements ExtendedUserStorage{
//作为测试示意,初始化属性直接用"exUser,exPassword,exInfo,ADMIN"表示一个已有用户
//此初始化属性可以在 Jar:///security/extendedUserStorageConfig.xml 中配置。
private String initInfo;
private Map<String,String> userpasswords = new HashMap<String,String>();
private Map<String,ExtendedUserInfo> userinfos = new HashMap<String,ExtendedUserInfo>();
@Override
public boolean isValid(String username, String password) {
if(userpasswords.keySet().contains(username)&&userpasswords.get(username).equals(password)){
return true;
}else{
return false;
}
}
@Override
public ExtendedUserInfo getUser(String username) {
if(userinfos.keySet().contains(username)){
return userinfos.get(username);
}else{
return null;
}
}
private void init(){
String[] strs = StringUtils.split(initInfo, ',');
String tmpName = strs[0];
userpasswords.put(tmpName, strs[1]);
ExtendedUserInfo testUserInfo = new ExtendedUserInfo();
testUserInfo.description = strs[2];
testUserInfo.roles = new HashSet<String>();
testUserInfo.roles.add(strs[3]);
userinfos.put(tmpName, testUserInfo);
}
public void setInitInfo(String initInfo) {
this.initInfo = initInfo;
init(); //初始化
}
public String getInitInfo() {
return initInfo;
}
}
在这个实现类里,只是使用 initInfo 模拟一个用户,做了一个简单的初始化,该用户的用户名:exUser,密码:exPassword,用户描述:exInfo,所属角色:ADMIN。@ExtendedUserStorageIdentification("userStorageSample") 标识该用户扩展存储类的 ID 为 userStorageSample。
创建 security/extendedUserStorageConfig.xml 进行配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd">
<bean id="userStorageSample" class="com.supermap.sample.security.ExtendedUserStorageSample">
<property name="initInfo" value="exUser,exPassword,exInfo,ADMIN"/>
</bean>
</beans>
可以将 ExtendedUserStorageSample 实现类编译结果,连同 extendedUserStorageConfig.xml 配置文件打成一个 Jar 包,放在%SuperMap iServer_HOME%/webapps/iserver/WEB-INF/lib 下,重启 SuperMap iServer 服务即可。
注意:extendedUserStorageConfig.xml 位于 Jar:///security/extendedUserStorageConfig.xml 位置,extendedUserStorageConfig.xml 的名称和位置都不允许修改。
访问服务列表,即 http://localhost:8090/iserver/services,点击右上角进行登录,输入以上用户扩展存储实现中,我们模拟的用户 exUser 和密码 exPassword,点击确定登录,即可在右上角看到登录成功的信息。点击 exUser 用户查看详细信息,即可查看 exUser 所属的角色等信息。
此时通过管理员账户登录 iServer,在服务管理器的用户选项卡,也能找到 exUser 用户。