扩展使用自定义的第三方账户 |
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 用户。