今天恰巧在一个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
岁月如歌 阅读(1178)
评论(0) 编辑 收藏 所属分类:
java