歲月如哥
          人生非夢
          posts - 50,comments - 144,trackbacks - 0
          今天恰巧在一個tomcat同時發(fā)布了兩個系統(tǒng):DAXT、XFXT。tomcat啟動順序為先DAXT后XFXT,啟動完成之后發(fā)現(xiàn)DAXT可以登錄,但是XFXT不能登錄(單個系統(tǒng)發(fā)布可以登錄)。通過跟蹤XFXT登錄發(fā)現(xiàn)在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);
          一般情況我們每個系統(tǒng)都在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的初始化,發(fā)現(xiàn)在com.sun.security.auth.login.ConfigFile.init()初始化的時候是從系統(tǒng)變量獲取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();
                          // 如果運行環(huán)境中已經存在,則不配置
                          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只能存在一份,啟動DAXT時候已經初始化,后續(xù)啟動XFXT的時候已經不能初始化XFXT的SummerLoginModule。而在XFXT登錄的時候,實際上就只能獲取到DAXT的LoginModule了。
                 當然如果幾個系統(tǒng)使用的是同一個LoginModule類,上述問題就不會存在了。目前有三個LoginModule:FYLoginModule、SJFYLoginModule StatLoginModule,如果把這三個類合成為一個公用的LoginModule倒是可以解決問題,但是感覺很怪異。。。。
          posted on 2009-07-15 17:09 歲月如歌 閱讀(1194) 評論(0)  編輯  收藏 所屬分類: java
          主站蜘蛛池模板: 黑龙江省| 江北区| 洪洞县| 和平县| 衡阳县| 石首市| 新巴尔虎左旗| 阜新| 遂平县| 牟定县| 双鸭山市| 蒙自县| 嘉义市| 阜新| 崇礼县| 五河县| 靖宇县| 庆云县| 嘉义市| 仲巴县| 囊谦县| 南川市| 商水县| 康平县| 巴彦县| 晋州市| 秦安县| 高密市| 南投市| 周口市| 沙雅县| 简阳市| 广平县| 九江市| 新津县| 吐鲁番市| 北票市| 峡江县| 邵阳市| 大竹县| 健康|