spring security3.x学习(22)_关于ip的过滤器

看到电子书的第六章了,我粗略的看了一下,发现第六章的知识很乱,需要前期的基础知识要很好才可以看懂,
所以从这次开始,我自己开始动手写一些例子进行练习(其实基础知识基本上已经学完了,剩下的都是高级配置了)

我先写好了一个模板。以后我们学习就可以根据这个模板进行修改了。(spring mvc + spring security)


来看一下关于ip的允许访问配置:
[html]  view plain copy
  1. <span style="font-size:10px">< intercept-url pattern = "/user/index.html" access = "hasRole('ROLE_ADMIN') and hasIpAddress('127.0.0.1')"/></span>  


这样就可以把允许访问的ip放到这里了。

这里有一个有意思的东西,自定义过滤器,我们以后要重写很多的自定义过滤器,所以就还是以过滤ip为例子自己写一个吧:

看一下过滤器:

[html]  view plain copy
  1. <span style="font-size:10px">public class IPRoleAuthenticationFilter extends OncePerRequestFilter {  
  2.   
  3.      // 目标角色  
  4.      private String role;  
  5.   
  6.      // 过滤ip  
  7.      private List<String> ips;  
  8.   
  9.      @Override  
  10.      protected void doFilterInternal(HttpServletRequest request,  
  11.                HttpServletResponse response, FilterChain chain)  
  12.                throws ServletException, IOException {  
  13.           final Authentication authentication = SecurityContextHolder  
  14.                     .getContext().getAuthentication();  
  15.           if (authentication != null & role != null) {  
  16.                Collection<? extends GrantedAuthority> authorities = authentication  
  17.                          .getAuthorities();  
  18.                // 是否权限验证可以通过  
  19.                boolean hasAuthority = false;  
  20.                // 对权限进行对比  
  21.                for (GrantedAuthority grantedAuthority : authorities) {  
  22.                     // 如果对比的权限相同 ,那么就可以说明有权限  
  23.                     if (grantedAuthority.getAuthority().equals(getRole())) {  
  24.                          hasAuthority = true;  
  25.                          break;  
  26.                     }  
  27.                }  
  28.                // 是否ip验证可以通过  
  29.                boolean hasIp = false;  
  30.                // 对ip进行对比  
  31.                if (ips.size() > 0 && hasAuthority) {  
  32.                     // 获取ip  
  33.                     String requestsIp = request.getRemoteAddr();  
  34.                     for (String ip : ips) {  
  35.                          if (ip.equals(requestsIp)) {  
  36.                               hasIp = true;  
  37.                               break;  
  38.                          }  
  39.                     }  
  40.                     if(!hasIp){  
  41.                          throw new AccessDeniedException("ip被拦截,您的ip是: " + requestsIp);  
  42.                     }  
  43.                }  
  44.           }  
  45.           chain.doFilter(request, response);  
  46.      }  
  47.   
  48.      // setter和getter方法  
  49.      ....  
  50. }</span>  

然后配置此bean:
[html]  view plain copy
  1. <span style="font-size:10px"><bean id="ipFilter" class="com.dsun.security.IPRoleAuthenticationFilter">  
  2.           <property name="role" value="ROLE_ADMIN" />  
  3.           <property name="ips">  
  4.                <list>  
  5.                     <value>192.168.0.0</value>  
  6.                </list>  
  7.           </property>  
  8. </bean></span>  

当然我们这里配置的已经是一个过滤器了。 那spring security本身就是过滤器链组成的
那么我们就可以把它放到链中了:
[html]  view plain copy
  1. <span style="font-size:10px"><http auto-config="true" use-expressions="true">  
  2.           <!-- 不拦截登录页面 -->  
  3.           <intercept-url pattern="/login.html" access="permitAll"/>  
  4.            
  5.           <!-- 配置一个登录标签 -->  
  6.           <form-login username-parameter="username"  
  7.                     password-parameter="password" login-processing-url="/dologin"  
  8.                     default-target-url="/user/index.html" login-page="/login.html" />      
  9.            
  10.           <!-- 配置关于ip和角色的自定义拦截器   并且他们要在可以访问之前(对应过滤器:FILTER_SECURITY_INTERCEPTOR) -->  
  11.           <custom-filter ref="ipFilter" before="FILTER_SECURITY_INTERCEPTOR"/>      
  12.      </http></span>  

然后我们就是测试一下了,他允许通过的ip是192.168.0.0 很明显  咱们不是。
我使用127.0.0.1进行登陆:

好的 那我们成功了。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值