<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    gembin

    OSGi, Eclipse Equinox, ECF, Virgo, Gemini, Apache Felix, Karaf, Aires, Camel, Eclipse RCP

    HBase, Hadoop, ZooKeeper, Cassandra

    Flex4, AS3, Swiz framework, GraniteDS, BlazeDS etc.

    There is nothing that software can't fix. Unfortunately, there is also nothing that software can't completely fuck up. That gap is called talent.

    About Me

     

    為Spring Security添加IP限制功能

    項目中要為SpringSecurity添加IP限制功能,一開始的做法是繼承DaoAuthenticationProvider,在additionalAuthenticationChecks方法中使用WebAuthenticationDetails的getRemoteAddress獲取客戶端IP,然后判斷是否需要限制登錄。

    在tomcat上單獨部署時,這樣做一切正常,當使用apache作為前端代理時,發現總是提示IP錯誤,從日志中發現,getRemoteAddress方法總是返回apache的IP。查看WebAuthenticationDetails的源碼發現:

    this.remoteAddress = request.getRemoteAddr();

    當有代理存在時,request.getRemoteAddr()是不能正確獲取客戶端IP的(http://mrlee23.javaeye.com/blog/510747),

    需要使用http header中的x-forwarded-for獲取IP,方法如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public static final String getIpAddr(final HttpServletRequest request)
    throws Exception {
    if (request == null) {
    throw (new Exception(
    "getIpAddr method HttpServletRequest Object is null"));
    }
    String ipString = request.getHeader("x-forwarded-for");
    if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString)) {
    ipString = request.getHeader("Proxy-Client-IP");
    }
    if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString))request.getHeader("WL-Proxy-Client-IP");
    }
    if (StringUtils.isBlank(ipString) || "unknown".equalsIgnoreCase(ipString))request.getRemoteAddr();
    }

    // 多個路由時,取第一個非unknown的ip
    final String[] arr = ipString.split(",");
    for (final String str : arr) {
    if (!"unknown".equalsIgnoreCase(str))ipString = str;
    break;
    }
    }

    return ipString;
    }

    參考http://www.tkk7.com/taochen1984/articles/310072.html中的說明自定義Spring Security的一些組件:

    • 擴展WebAuthenticationDetails,保存request為一個屬性
    • 擴展WebAuthenticationDetailsSource,設置clazz為上面擴展出來的WebAuthenticationDetails修改spring security配置文件,添加以下bean:
         <bean id="authenticationProcessingFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
          <property name="authenticationDetailsSource" ref="authenticationDetailsSource" />
          <property name="authenticationManager" ref="authenticationManager" />
          <property name="filterProcessesUrl" value="/j_spring_security_check" />
          <property name="authenticationSuccessHandler" ref="authenticationSuccessHandler" />
          <property name="authenticationFailureHandler" ref="authenticationFailureHandler" />
          </bean>
          <bean id="authenticationSuccessHandler" class="org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler">
          <property name="defaultTargetUrl" value="/loginsuccess.jsp" />
          </bean>
          <bean id="authenticationFailureHandler" class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler">
          <property name="defaultFailureUrl" value="/admin.jsp?error=1" />
          </bean>
          <bean id="authenticationDetailsSource" class="javacommon.security.springsecurity.CustomWebAuthenticationDetailsSource"/>
          <bean id="authenticationProcessingFilterEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
          <property name="loginFormUrl" value="/admin.jsp" />
          <property name="forceHttps" value="false" />
          </bean>

      取消s:http的auto-config屬性,將自定義的authenticationProcessingFilter設置為FORM_LOGIN_FILTER:

    <s:http access-denied-page="/fault.jsp"  entry-point-ref="authenticationProcessingFilterEntryPoint">
    <s:logout logout-success-url="/admin.jsp" />
    <s:remember-me/>
    <s:anonymous/>
    <s:custom-filter position="FORM_LOGIN_FILTER" ref="authenticationProcessingFilter" />
    </s:http>

    from: http://codingmu.ixiezi.com/

    posted on 2010-10-11 17:24 gembin 閱讀(3970) 評論(0)  編輯  收藏 所屬分類: Spring


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    導航

    統計

    常用鏈接

    留言簿(6)

    隨筆分類(440)

    隨筆檔案(378)

    文章檔案(6)

    新聞檔案(1)

    相冊

    收藏夾(9)

    Adobe

    Android

    AS3

    Blog-Links

    Build

    Design Pattern

    Eclipse

    Favorite Links

    Flickr

    Game Dev

    HBase

    Identity Management

    IT resources

    JEE

    Language

    OpenID

    OSGi

    SOA

    Version Control

    最新隨筆

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    free counters
    主站蜘蛛池模板: 丁香花在线观看免费观看图片| 色在线亚洲视频www| 日韩免费高清大片在线 | 亚洲人成电影在线观看网| 在线观看免费为成年视频| 黄页免费视频播放在线播放| 久久乐国产精品亚洲综合| 67194国产精品免费观看| 男人的天堂av亚洲一区2区| 亚洲成在人线av| 在线观看免费为成年视频| 免费网站观看WWW在线观看| 亚洲中文字幕一二三四区| 中文字幕精品亚洲无线码一区| 久久国内免费视频| 久久免费99精品国产自在现线| 欧洲 亚洲 国产图片综合| 亚洲av综合色区| 免费人成视频x8x8入口| 免费国产作爱视频网站| 成人免费777777被爆出| 亚洲午夜福利在线视频| 亚洲韩国—中文字幕| 一本色道久久88综合亚洲精品高清| 69免费视频大片| 久久av免费天堂小草播放| 亚洲色欲色欲www| 色婷婷亚洲十月十月色天| 亚洲性日韩精品一区二区三区| 操美女视频免费网站| 最近免费字幕中文大全视频| 国产黄片不卡免费| 国产精品亚洲精品久久精品| 亚洲国产成人资源在线软件 | 亚洲成aⅴ人片在线影院八| 亚洲国产精品尤物yw在线 | 亚洲精品乱码久久久久久下载| 亚洲精品无码AV中文字幕电影网站 | 中国一级全黄的免费观看| 精品亚洲视频在线| 中文字幕精品三区无码亚洲|