歲月如哥
          人生非夢
          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 歲月如歌 閱讀(1189) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 庐江县| 垫江县| 凌源市| 哈尔滨市| 德州市| 保定市| 叙永县| 酒泉市| 肥乡县| 伊川县| 无棣县| 南和县| 库车县| 内丘县| 丁青县| 宜昌市| 海宁市| 佛教| 六盘水市| 巴彦县| 班玛县| 池州市| 抚松县| 陆河县| 浮山县| 钟祥市| 略阳县| 滨海县| 巩义市| 通渭县| 洮南市| 宜丰县| 开化县| 桓台县| 马鞍山市| 扬中市| 稷山县| 达孜县| 芦山县| 马龙县| 定远县|