场景:
公司上线的权限系统涉及的有一个功能:
- 使用其它平台的认证,如果通过。我们的平台也算认证通过。
- 公司同一个产品可能有多家公司在用,每家的认证平台也不一样,认证方式不一样,数据格式也不一样。
- 在以上两种情况出现的时候,还要保证公司产品保持标准化,以便客户后面升级。
这样就比较麻烦了。按理讲,这种情况就属于客户定制版本。升级也是按照自制版本升级。标准产品里的新功能要去每一个定制产品里做合并。
在这种各个客户要各种功能的情况越来越多,标准版本要合并到各定制版本的工作量越来越大。所以思考出以下解决方案。
- 统一功能的接口;
- 为各现场做不同的实现;
- 做一个配置,表明是哪个实现;
- 把实现类注入到Spring中,以便使用.
下面给出一个目前做出来效果比较好的具体例子:
- 登录这个功能的通用接口
public interface AdLoginService {
public boolean adLogin(String userName, String password, String url);
}
- 这个接口功能的不同实现类:
a. 通用实现
@Service
public class AdLoginServiceGeneralImpl implements AdLoginService{
@Autowired
private MConfig mConfig;
@Override
public boolean adLogin(String userName, String password, String url) {
// String adPath = String.format(config.getADPathtmpl(), username);
String adPath = String.format(mConfig.get("sys.config.ADPathtmpl"), userName);
Hashtable<String, String> HashEnv = new Hashtable<String, String>();
HashEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
HashEnv.put(Context.SECURITY_PRINCIPAL, adPath);
HashEnv.put(Context.SECURITY_CREDENTIALS, password);
HashEnv.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
HashEnv.put("com.sun.jndi.ldap.connect.timeout", "3000");
// HashEnv.put(Context.PROVIDER_URL, config.getADUrl());
HashEnv.put(Context.PROVIDER_URL, url);
try {
DirContext ctx