`
kong0itey
  • 浏览: 304860 次
社区版块
存档分类
最新评论

《Spring Security3》第六章第一部分翻译(自定义安全过滤器)(转载)

阅读更多

第六章   高级配置和扩展

到目前为止,我们已经介绍了大多数 Spring Security 组件的理论以及架构和使用。我们的 JBCP Pets 商业站点也在逐渐变成一个安全的 web 应用,我们将会深入讲解一些更有难度的挑战。

在本章的课程中,我们将会:

l  实现我们自己的安全过滤器,解决一个很有趣的问题,即对特定的用户角色用 IP 过滤的方式增强站点的安全;

l  构建自定义的 AuthenticationProvider 及需要的支持类;

l  理解和实现反黑客的措施名为 session 固化防护( session fixation protection )以及 session 的并发控制;

l  使用包括 session 并发控制等功能构建简单的用户 session 报告增强;

l  配置以及自定义访问拒绝后的行为和异常处理;

l  构建基于 Spring bean Spring Security 配置,放弃使用便利的安全命名空间 <http> 配置风格,从头开始直接织入和实例化完整的 Spring Security 大量类;

l  了解如何通过基于 Spring bean 的方式配置 session 的处理和创建;

l  对比 <http> 配置风格相对于基于 Spring bean 配置风格的优劣;

l  学习 AuthenticationEvent 的架构以及事件处理和自定义;

l  构建一个自定义的 SpEL 表达式投票器,新建一个 SpEL 方法并在 <intercept-url> 表达式中使用。

 

实现一个自定义的安全过滤器

         对于安全应用来说,一个很常见的定制化场景就是使用自定义的 servlet 过滤器,它能够用来增加应用特定的安全层,通过提供更完整的信息增强用户体验,并移除潜在的恶意行为。

servlet 过滤器级别实现 IP 过滤

         一个能够使得 JBCP Pets 安全审计人员很高兴的功能增强就是围绕管理员账号的使用进行更强限制,或者(更好的是)针对所有用户对站点的管理操作。

         我们通过一个过滤器来解决这个问题,保证所有具有 ROLE_ADMIN 角色的用户只能在一系列特定的 IP 地址上访问系统。我们将会在此做简单的地址匹配,但是你可以很容易地扩展这个例子,来使用 IP 掩码、从数据库中读取 IP 地址等。

         细致的用户可能会意识到会有其它的方法来实现这个功能,包括更复杂的 <intercept-url> 访问声明;但是,为了阐述的方便,这是一个很简单直接的例子。记住在现实世界中,诸如网络地址转换( Network Address Translation NAT )以及动态 IP 地址会使得基于 IP 的规则在公网或无管理的网络中很脆弱。

书写我们自己的 servlet 过滤器

         我们的过滤器将会设置成目标角色以及特定的 IP 地址才能允许访问。我们将这个类命名为 com.packtpub.springsecurity.security.IPRoleAuthenticationFilter ,并定义如下。这个代码有一些复杂,所以省略掉了一下不重要的代码列表。请查看本章的源代码以了解此类:

 

Java代码  收藏代码
  1. package  com.packtpub.springsecurity.security;  
  2. // imports omitted   
  3. public   class  IPRoleAuthenticationFilter  extends  OncePerRequestFilter  
  4.   {}  

 可以看到,我们的过滤器继承自 Spring web 库中的 o.s.web.filter.OncePerRequestFilter 基类。但这并不是必须的,这对于具有复杂配置且至执行一次的过滤器来说很便利,所以我们建议使用。

 

Java代码  收藏代码
  1. private  String targetRole;  
  2. private  List<String> allowedIPAddresses;  

 我们的过滤器具有两个属性——目标角色(如 ROLE_ADMIN ),以及一个允许的 IP 地址列表。这将会通过标准的 Spring bean 定义进行配置,我们将会稍后见到。最后,我们到达这个 bean 的核心,也就是 doFilterInternal 方法。

 

Java代码  收藏代码
  1. @Override   
  2.   public   void  doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain)  throws  IOException, ServletException {  
  3.       // before we allow the request to proceed, we'll first get the user's role   
  4.       // and see if it's an administrator   
  5.       final  Authentication authentication = SecurityContextHolder.  
  6. getContext().getAuthentication();  
  7.       if  (authentication !=  null  && targetRole !=  null ) {  
  8.           boolean  shouldCheck =  false ;  
  9.       // look if the user is the target role   
  10.           for  (GrantedAuthority authority : authentication.getAuthorities()) {  
  11.               if (authority.getAuthority().equals(targetRole)) {  
  12.                   shouldCheck = true ;  
  13.                   break ;  
  14.                    }  
  15.           }  
  16.           // if we should check IP, then check   
  17.           if (shouldCheck && allowedIPAddresses.size() >  0 ) {  
  18.               boolean  shouldAllow =  false ;  
  19.               for  (String ipAddress : allowedIPAddresses) {  
  20.                   if (req.getRemoteAddr().equals(ipAddress)) {  
  21.                       shouldAllow = true ;  
  22.                       break ;  
  23.                   }  
  24.               }  
  25.                 
  26.               if (!shouldAllow) {  
  27.                   // fail the request   
  28.                   throw   new  AccessDeniedException(“Access has been    
  29.               denied for  your IP address: “+req.getRemoteAddr());  
  30.               }  
  31.           }  
  32.       } else  {  
  33.         logger.warn(“The IPRoleAuthenticationFilter should be placed  
  34. after the user has been authenticated in the filter chain.”);  
  35.       }  
  36.       chain.doFilter(req, res);    
  37.   }  
  38. // accessors (getters and setters) omitted   
  39. }  

 你可以看到,代码很简单明了,使用 SecurityContext 来获得 Authentication 关于当前请求的信息,就像我们在前面的章节练习中所作的那样。你可能会意识到没有很多特定与 Spring Security 的东西,除了获取用户角色( GrantedAuthority )的方法以及使用了 AccessDeniedException 来标示访问被拒绝。

         让我们看一下如何作为一个 Spring bean 配置自定义的过滤器。

配置 IP servlet 过滤器

配置这个过滤器作为一个简单的 Spring bean 。我们可以在 dogstore-base.xml 文件中配置它。

 

Xml代码  收藏代码
  1. < bean   id = "ipFilter"   class = "com.packtpub.springsecurity .security.IPRoleAuthenticationFilter" >   
  2.   < property   name = "targetRole"   value = "ROLE_ADMIN" />   
  3.   < property   name = "allowedIPAddresses" >   
  4.     < list >   
  5.       < value > 1.2.3.4 </ value >   
  6.     </ list >   
  7.   </ property >   
  8. </ bean >    

使用标准的 Spring bean 配置语法,我们能够提供一系列的 IP 地址值。在本例中, 1.2.3.4 显然不是合法的 IP 地址(如果本地部署的话, 127.0.0.1 会是不错的一个 IP 地址配置),但是它为我们提供了便利的方式来测试这个过滤器是否生效。

         最后,我们要将这个过滤器添加到 Spring Security 的过滤器链中。

IP servlet 过滤器添加到 Spring Security 过滤器链中

          要添加到 Spring Security 过滤器链中的 Servlet 过滤器要通过相对于已经存在于过滤器链中其它过滤器来确定位置。自定义的过滤器要在 <http> 元素中配置,通过一件简单 bena 引用和位置标示, IP servlet 过滤器的配置如下:

Xml代码  收藏代码
  1. < http >   
  2.   < custom-filter   ref = "ipFilter"   before = "FILTER_SECURITY_INTERCEPTOR" />   
  3. </ http >    

  需要记住的是我们的过滤器依赖于 SecurityContext Authentication 对象,来进行辨别用户的 GrantedAuthority 。所以,我们要将这个过滤器的位置放在 FilterSecurityInterceptor 之前,它(你可能会回忆起第二章: Spring Security 起步 )负责确定用户是否有正确的权限访问系统。在过滤器的这个点上,用户的标示信息已经知道了,所以这是一个合适的位置以插入我们的过滤器。

         现在你可以重启应用,因为这个新的 IP 过滤器,作为 admin 用户登录将会被限制。你可以对其进行随意的修改,以完全理解各部分是如何协同的。

【扩展 IP 过滤器。对于更复杂的需求,可以扩展这个过滤器以允许对角色和 IP 地址(子网匹配, IP 段等)更复杂的匹配。但是,在 java 中并没有广泛使用的类库来进行这种类型的计算——考虑到安全环境中普遍存在的 IP 过滤,这一点颇令人吃惊。】

         尝试增强 IP 过滤器的功能以添加我们尚未描述到的功能——动手是学习的最好方法,而将练习改造成现实世界中的例子是将抽象概念变得具体的很好方式。

分享到:
评论

相关推荐

    Spring Security3中文文档

    本章深入探讨了Spring Security3的内部机制,包括安全过滤器链、认证管理器(Authentication Manager)的工作原理以及如何定制这些组件以满足特定需求。 ### 第三章:高级安全特性 此章节涵盖了更高级的主题,如退出...

    《Spring Security3》第二章第三部分翻译(下)附前两章doc文档

    《Spring Security3》第二章第三部分的翻译下篇主要涵盖了Spring Security的核心概念和技术,这部分内容是深入理解Spring Security架构和实现安全控制的关键。在本章节中,我们将详细探讨以下几个核心知识点: 1. *...

    spring security3 中文版本

    自此之后,Spring Security 成为了 Spring 生态系统中的一个重要组成部分,不断迭代更新,以适应不断变化的安全需求和技术发展。 ##### 1.3 发行版本号 Spring Security 3.0.1 是在 Spring Security 3.0 的基础上...

    Spring Security-3中文官方文档(及教程)

    教程文档则可能深入到实践操作,包括如何配置Spring Security、创建第一个安全应用、调试和测试安全设置,以及如何解决常见问题。通过学习这套文档和教程,开发者可以掌握Spring Security的核心原理,从而为自己的...

    Spring Security 资料合集

    - Spring Security 的核心是过滤器链,它包含了一系列安全过滤器,如`FilterSecurityInterceptor`和`AuthenticationProcessingFilter`。这些过滤器在请求处理前进行拦截,执行认证和授权操作。 3. **安全性配置**...

    Spring Security3

    - **自定义过滤器配置**:可以针对特定场景定制过滤器的行为,如IP地址白名单过滤等。 综上所述,Spring Security3不仅提供了一整套强大的安全解决方案,还允许开发者根据具体的应用需求进行高度的定制化。无论是...

    springSecurity3例子

    Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它为Web应用程序提供了全面的身份验证、授权和访问控制功能。在Spring Security 3版本中,这个框架进一步完善了其特性和性能,使其成为开发者...

    SpringSecurity笔记,编程不良人笔记

    - **Filter Chain**: SpringSecurity通过一系列过滤器实现其安全功能,这些过滤器构成了Filter Chain。每个过滤器负责特定的安全任务,如认证、授权等。 - **Authentication**: 表示用户的身份信息,包括用户名、...

    spring security 官方文档

    Spring Security 是一个强大的安全框架,用于为Java应用提供全面的安全管理解决方案。它是Spring生态系统的组成部分,专注于身份验证、授权和访问控制。Spring Security的核心特性包括: 1. **身份验证...

    springsecurity学习笔记

    4. **Filter Chain**:Spring Security通过一系列过滤器形成一个过滤链,每个过滤器都有特定的任务,如BasicAuthenticationFilter处理基本认证,RememberMeAuthenticationFilter处理记住我功能等。 5. **Session ...

    springsecurity3x快速构建企业级安全

    - **过滤器链(Filter Chain)**:Spring Security的核心是其过滤器链,它由多个预定义的和自定义的过滤器组成,如`DelegatingFilterProxy`、`SecurityContextHolderAwareRequestFilter`等。这些过滤器按顺序执行,...

    SpringSecurity源码

    1. **过滤器链**:SpringSecurity的核心是基于过滤器的Web安全模型,它通过一系列预定义的过滤器(如`HttpSessionAuthenticationFilter`、`UsernamePasswordAuthenticationFilter`等)拦截HTTP请求,执行相应的安全...

    spring security第一个项目

    它由四个主要组件组成:Filter Security Interceptor(过滤器安全拦截器)、Access Decision Manager(访问决策管理器)、Authentication Manager(认证管理器)和UserDetailsService(用户详情服务)。这些组件协同...

    SpringSecurity素材.rar

    1. **SpringSecurity简介**:首先会介绍SpringSecurity的基本概念和架构,包括它如何通过层层过滤器保护Web应用,以及它提供的主要组件如Authentication(认证)和Authorization(授权)。 2. **配置SpringSecurity...

    一个比较好的spring security实例

    Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它提供了认证、授权和访问控制等功能,使得开发者可以轻松地在应用程序中实现复杂的安全需求。在这个名为 "mysecurity" 的压缩包中,很可能是...

    SpringMVC集成SpringSecurity

    其中,过滤器链是SpringSecurity处理请求的第一道防线,它会拦截所有HTTP请求并进行安全检查。 2. **集成过程**:在SpringMVC项目中集成SpringSecurity,首先需要在pom.xml文件中引入相应的依赖,接着配置Spring...

    spring security权限管理开发手册及实例.rar

    - 实例代码:通过运行和调试`springsecurity-sample`,你可以直观地看到每个安全配置在实际应用中的效果。 通过以上内容,你应该能对Spring Security有一个全面的了解,并能够着手开始你的权限管理项目。这个...

    springsecurity使用demo

    SpringSecurity 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在本示例中,我们将探讨如何使用 SpringSecurity 构建一个基本的认证和授权流程。 首先,Spring Security 的核心...

    Spring Security3 中文版 张卫滨 推荐

    ### 第一章:一个不安全应用的剖析 本章节通过分析一个不安全的应用案例,引出了安全审计的重要性,并对Spring Security的应用背景进行了介绍。 - **安全审计**:介绍了如何通过日志记录等方式来进行安全审计,以...

Global site tag (gtag.js) - Google Analytics