歲月如哥
          人生非夢(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ā)布可以登錄)。通過(guò)跟蹤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文件,用來(lái)配置登錄所用的LoginModule
           DAXT的為
          引用:
          SummerLoginModule{
             com.thunisoft.fy.security.login.FYLoginModule required debug=true;
          };
          XFXT的為
          引用:
          SummerLoginModule{
             com.thunisoft.fy.security.login.SJFYLoginModule required debug=true;
          };
          通過(guò)跟蹤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);
                          }
                  }
          顯然問(wèn)題原因在于系統(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類,上述問(wèn)題就不會(huì)存在了。目前有三個(gè)LoginModule:FYLoginModule、SJFYLoginModule StatLoginModule,如果把這三個(gè)類合成為一個(gè)公用的LoginModule倒是可以解決問(wèn)題,但是感覺很怪異。。。。
          posted on 2009-07-15 17:09 歲月如歌 閱讀(1194) 評(píng)論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 太谷县| 栖霞市| 专栏| 连州市| 柯坪县| 永胜县| 青阳县| 阳泉市| 蒲江县| 新竹县| 雅江县| 沙雅县| 青铜峡市| 清丰县| 两当县| 盘山县| 万年县| 普定县| 永昌县| 伊宁县| 蒙阴县| 枣阳市| 六盘水市| 布尔津县| 新晃| 祁东县| 德钦县| 南丰县| 辽阳县| 观塘区| 隆子县| 贵港市| 江西省| 九台市| 安化县| 历史| 海阳市| 乐都县| 清水县| 宝清县| 东兴市|