歲月如哥
          人生非夢(mèng)
          posts - 50,comments - 144,trackbacks - 0
          今天恰巧在一個(gè)tomcat同時(shí)發(fā)布了兩個(gè)系統(tǒng):DAXT、XFXT。tomcat啟動(dòng)順序為先DAXT后XFXT,啟動(dòng)完成之后發(fā)現(xiàn)DAXT可以登錄,但是XFXT不能登錄(單個(gè)系統(tǒng)發(fā)布可以登錄)。通過跟蹤XFXT登錄發(fā)現(xiàn)在UserAASAction的如下代碼處獲取的SummerLoginModule為com.thunisoft.fy.security.login.FYLoginModule
          復(fù)制內(nèi)容到剪貼板
          代碼:
          LoginContext loginContext = new LoginContext(
          longinModule == null ? GlobalKey.KEY_LoginModule: longinModule, handler);
          loginContext.login();
          subject = loginContext.getSubject();
          request.getSession().setAttribute(GlobalKey.KEY_USER, subject);
          一般情況我們每個(gè)系統(tǒng)都在src目錄下有一個(gè)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的初始化,發(fā)現(xiàn)在com.sun.security.auth.login.ConfigFile.init()初始化的時(shí)候是從系統(tǒng)變量獲取SummerLogin.config文件并進(jìn)行初始化的,如下
          復(fù)制內(nèi)容到剪貼板
          代碼:
          String extra_config = System.getProperty("java.security.auth.login.config");
          至此,就需要找到初始化java.security.auth.login.config的地方,最后在com.thunisoft.summer.sys.PropertyResource找到初始化的源碼
          復(fù)制內(nèi)容到剪貼板
          代碼:
          private void setEnvironment() {
                          Properties props = System.getProperties();
                          // 如果運(yùn)行環(huán)境中已經(jīng)存在,則不配置
                          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);
                          }
                  }
          顯然問題原因在于系統(tǒng)變量java.security.auth.login.config只能存在一份,啟動(dòng)DAXT時(shí)候已經(jīng)初始化,后續(xù)啟動(dòng)XFXT的時(shí)候已經(jīng)不能初始化XFXT的SummerLoginModule。而在XFXT登錄的時(shí)候,實(shí)際上就只能獲取到DAXT的LoginModule了。
                 當(dāng)然如果幾個(gè)系統(tǒng)使用的是同一個(gè)LoginModule類,上述問題就不會(huì)存在了。目前有三個(gè)LoginModule:FYLoginModule、SJFYLoginModule StatLoginModule,如果把這三個(gè)類合成為一個(gè)公用的LoginModule倒是可以解決問題,但是感覺很怪異。。。。
          posted on 2009-07-15 17:09 歲月如歌 閱讀(1194) 評(píng)論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 胶州市| 泸西县| 莱阳市| 福泉市| 哈密市| 中西区| 资阳市| 聊城市| 报价| 大关县| 阳春市| 都兰县| 自治县| 河北省| 新和县| 香港| 清涧县| 六安市| 皋兰县| 呼和浩特市| 贺州市| 祁阳县| 林口县| 平塘县| 登封市| 桃园县| 龙门县| 青州市| 红安县| 进贤县| 锡林浩特市| 金溪县| 奉化市| 方山县| 民乐县| 宿迁市| 武威市| 米脂县| 竹北市| 鄂温| 武清区|