今天恰巧在一個tomcat同時發布了兩個
系統:DAXT、XFXT。tomcat啟動
順序為先DAXT后XFXT,啟動完成之后發現DAXT可以登錄,但是XFXT不能登錄(單個系統發布可以登錄)。通過跟蹤XFXT登錄發現在UserAASAction的如下
代碼處獲取的SummerLoginModule為com.thunisoft.fy.security.login.FYLoginModule
復制內容到剪貼板
代碼:
LoginContext loginContext = new LoginContext(
longinModule == null ? GlobalKey.KEY_LoginModule: longinModule, handler);
loginContext.login();
subject = loginContext.getSubject();
request.getSession().setAttribute(GlobalKey.KEY_USER, subject);
一般情況我們每個系統都在src目錄下有一個SummerLogin.config文件,用來配置登錄所用的LoginModule
DAXT的為
引用:
SummerLoginModule{
com.thunisoft.fy.security.login.FYLoginModule required debug=true;
};
XFXT的為
引用:
SummerLoginModule{
com.thunisoft.fy.security.login.SJFYLoginModule required debug=true;
};
通過跟蹤LoginContext的初始化,發現在com.sun.security.auth.login.ConfigFile.init()初始化的時候是從系統
變量獲取SummerLogin.config文件并進行初始化的,如下
復制內容到剪貼板
代碼:
String extra_config = System.getProperty("java.security.auth.login.config");
至此,就需要找到初始化
java.security.auth.login.config的地方,最后在com.thunisoft.summer.sys.PropertyResource找到初始化的源碼
復制內容到剪貼板
代碼:
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);
}
}
顯然
問題原因在于系統變量java.security.auth.login.config只能存在一份,啟動DAXT時候已經初始化,后續啟動XFXT的時候已經不能初始化XFXT的SummerLoginModule。而在XFXT登錄的時候,實際上就只能獲取到DAXT的LoginModule了。
當然如果幾個系統使用的是同一個LoginModule類,上述問題就不會存在了。目前有三個LoginModule:FYLoginModule、SJFYLoginModule StatLoginModule,如果把這三個類合成為一個公用的LoginModule倒是可以解決問題,但是感覺很怪異。。。。
posted on 2009-07-15 17:09
歲月如歌 閱讀(1188)
評論(0) 編輯 收藏 所屬分類:
java