扩展使用自定义的第三方账户

发送反馈


SuperMap iServer 提供了 ExtendedUserStorage 接口用于第三方扩展用户的验证,用户通过扩展开发可使 iServer 与已有的认证服务器对接。

ExtendedUserStorage 接口介绍

com.supermap.services.security.ExtendedUserStorage 接口有如下方法:

当 iserver 中需要验证用户名和密码时,会调用该方法,

该方法获取用户相关的信息,将用户系统的已有的用户信息导入到 iserver 的系统中。这些信息包括:groups(用户所属组),roles(用户所属的角色),description(描述信息)等。

用户在实现 ExtendedUserStorage 接口时,还要加上 @ExtendedUserStorageIdentification("extendID") 注记。

扩展和配置流程

我们通过实现一个简单的扩展,来说明扩展第三方认证的流程。

1,实现一个扩展用户存储类

实现 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。

2、配置用户扩展存储类

创建 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 的名称和位置都不允许修改。

3、查看扩展结果

访问服务列表,即 http://localhost:8090/iserver/services,点击右上角进行登录,输入以上用户扩展存储实现中,我们模拟的用户 exUser 和密码 exPassword,点击确定登录,即可在右上角看到登录成功的信息。点击 exUser 用户查看详细信息,即可查看 exUser 所属的角色等信息。

此时通过管理员账户登录 iServer,在服务管理器的用户选项卡,也能找到 exUser 用户。