復制內容到剪貼板
一般情況我們每個系統都在src目錄下有一個SummerLogin.config文件,用來配置登錄所用的LoginModule代碼:
LoginContext loginContext = new LoginContext(
longinModule == null ? GlobalKey.KEY_LoginModule: longinModule, handler);
loginContext.login();
subject = loginContext.getSubject();
request.getSession().setAttribute(GlobalKey.KEY_USER, subject);
DAXT的為
引用:
SummerLoginModule{
com.thunisoft.fy.security.login.FYLoginModule required debug=true;
};
引用:
SummerLoginModule{
com.thunisoft.fy.security.login.SJFYLoginModule required debug=true;
};
復制內容到剪貼板
至此,就需要找到初始化java.security.auth.login.config的地方,最后在com.thunisoft.summer.sys.PropertyResource找到初始化的源碼
代碼:
String extra_config = System.getProperty("java.security.auth.login.config");
復制內容到剪貼板
顯然問題原因在于系統變量java.security.auth.login.config只能存在一份,啟動DAXT時候已經初始化,后續啟動XFXT的時候已經不能初始化XFXT的SummerLoginModule。而在XFXT登錄的時候,實際上就只能獲取到DAXT的LoginModule了。代碼:
private void setEnvironment() {
Properties props = System.getProperties();
// 如果運行環境中已經存在,則不配置
if (null == props.getProperty(GlobalKey.LOGIN_CONFIG)) {
String config = null;
try{
config = SysConfiguration.getInstance().getProperty(
GlobalKey.LOGIN_CONFIG);
}
catch(MissingResourceException mre){
logger.info(GlobalKey.LOGIN_CONFIG + ": Not Configured.");
}
// 如果配置文件中沒有配置則用缺省值
if (null == config || "".equalsIgnoreCase(config.trim())) {
URL url = PropertyResource.class
.getResource(GlobalKey.LOGIN_CONFIG_MODULE);
if (null != url)
props.setProperty(GlobalKey.LOGIN_CONFIG, url.getFile());
} else
props.setProperty(GlobalKey.LOGIN_CONFIG, config);
}
}
當然如果幾個系統使用的是同一個LoginModule類,上述問題就不會存在了。目前有三個LoginModule:FYLoginModule、SJFYLoginModule StatLoginModule,如果把這三個類合成為一個公用的LoginModule倒是可以解決問題,但是感覺很怪異。。。。