岁月如哥
人生非梦
posts - 50,comments - 144,trackbacks - 0
今天恰巧在一个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 岁月如歌 阅读(1168) 评论(0)  编辑  收藏 所属分类: java

只有注册用户登录后才能发表评论。


网站导航: