【仅供内部供应商使用,不提供对外解答和培训】

Page tree

【仅供内部供应商使用,不提供对外解答和培训】

Skip to end of metadata
Go to start of metadata

前言

目前决策平台提供了3种认证方式,分别是:内置认证、LDAP认证和HTTP认证,但是在某些情况下我们希望能扩展出自己的认证方式,这个时候就需要用到认证接口了。

Java部分接口

AuthenticateObjectType
 public interface AuthenticateObjectType extends XMLable {

    public static final String XML_TAG = "AuthenticateObjectType";

    public boolean authentication(Authentication authentication) throws Exception ;

    public boolean authenticationWithoutPassword();

    public String markType();

}

实现新认证方式的时候,就需要实现这个接口,并将实现类通过AuthenticateObjectTypeBuilder#register方法进行登记。

JavaScript部分接口

AuthenticateTypePool
/**
 * 认证方式
 *      @example
 *      FS.Plugin.AuthenticateTypePool.push({
 *          defineTypeString : function () {
 *             return 'weibo'
 *          },
 *          defineTitleString : function () {
 *             return '微博';
 *          },
 *          defineRowHeightNumber : function () {
 *             return 21;
 *          },
 *          defineUI : function () {
 *             return [{}, {}, {type: 'text', widgetName: 'weibo', watermark: 'weibo'}];
 *          },
 *          saveDataSync : function (container) {
 *             FS.Async.ajax({
 *                 url : '',
 *                 data : {}
 *             });
 *          },
 *          populateData : function (container) {
 *
 *          }
 *      });
 */
FS.Plugin.AuthenticateTypePool = [];

相关类

AuthenticateObjectTypeBuilder
public class AuthenticateObjectTypeBuilder {

    private static Map<String, Class<? extends AuthenticateObjectType>> map = new ConcurrentHashMap<String, Class<? extends AuthenticateObjectType>>();

    static {
        map.put("default", DefaultAuthenticateObjectType.class);
        map.put("http", HttpAuthenticateObjectType.class);
        map.put("ldap", LdapAuthenticateObjectType.class);
    }

    /**
     * 添加一个新类型的认证方式
     * @param type 新认证方式的key
     * @param clazz 新认证方式的实现类
     */
    public static void register(String type, Class<? extends AuthenticateObjectType> clazz) {
        if (map.containsKey(type)) {
            throw new RuntimeException("Duplicate key!");
        }
        map.put(type, clazz);
    }

    /**
     * 根据类型生成认证对象
     * @param type 用于表示类型的字符串
     * @return 认证对象
     */
    public static AuthenticateObjectType build(String type) {
        Class<? extends AuthenticateObjectType> clazz = map.get(type);
        if (clazz == null) {
            clazz = DefaultAuthenticateObjectType.class;
        }
        try {
            return clazz.newInstance();
        } catch (InstantiationException e) {
            FRLogger.getLogger().error(e.getMessage(), e);
        } catch (IllegalAccessException e) {
            FRLogger.getLogger().error(e.getMessage(), e);
        }
        return new DefaultAuthenticateObjectType();
    }
}

关联到平台

需要通过PlateProvider接口,将自定义的认证初始化,示例代码如下:

初始化自定义认证示例代码
public class CasAuthenticatePlate extends DefaultPlate {

    @Override
    public void initData() {
        super.initData();
        AuthenticateObjectTypeBuilder.register(CasConstants.MARK_TYPE, CasAuthenticateObjectType.class);
    }

    @Override
    public String[] getPlateJavaScriptFiles4WebClient() {
        return new String[]{
            "/com/fr/solution/plugin/auth/cas/web/auth.cas.js"
        };
    }
}

这段代码做了两件事,一是注册了自定义认证方式的Java类,二是引入了自定义认证web端设置界面的相关代码。

完整示例

完整的示例代码参见这里:https://git.fanruan.com/fanruan/demo-auth-cas

注意:配置的保存还没有实现

  • No labels

1 Comment

  1. 没有看懂,下面的完整代码打不开。