- 浏览: 306005 次
文章分类
最新评论
-
流年末年:
那四个参数还是没看懂.....能不能解释下showPassst ...
我写的密码强度验证方法(原创) -
kingcs2008:
// 验证pws.jsshowPassstrength(&qu ...
我写的密码强度验证方法(原创) -
h957355152:
请问博主这个怎么用呢?我直接放到jsp里面调用showPass ...
我写的密码强度验证方法(原创) -
qq_15138059:
我写的全国省市县三级联动菜单,拿出来和大家分享了(原创) -
valenon:
评论呢?从MAIL FROM命令开始貌似就出错了:500 Er ...
如何发送伪造的电子邮件
第六章 高级配置和扩展
到目前为止,我们已经介绍了大多数 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 ,并定义如下。这个代码有一些复杂,所以省略掉了一下不重要的代码列表。请查看本章的源代码以了解此类:
- package com.packtpub.springsecurity.security;
- // imports omitted
- public class IPRoleAuthenticationFilter extends OncePerRequestFilter
- {}
可以看到,我们的过滤器继承自 Spring web 库中的 o.s.web.filter.OncePerRequestFilter 基类。但这并不是必须的,这对于具有复杂配置且至执行一次的过滤器来说很便利,所以我们建议使用。
我们的过滤器具有两个属性——目标角色(如 ROLE_ADMIN ),以及一个允许的 IP 地址列表。这将会通过标准的 Spring bean 定义进行配置,我们将会稍后见到。最后,我们到达这个 bean 的核心,也就是 doFilterInternal 方法。
- @Override
- public void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain chain) throws IOException, ServletException {
- // before we allow the request to proceed, we'll first get the user's role
- // and see if it's an administrator
- final Authentication authentication = SecurityContextHolder.
- getContext().getAuthentication();
- if (authentication != null && targetRole != null ) {
- boolean shouldCheck = false ;
- // look if the user is the target role
- for (GrantedAuthority authority : authentication.getAuthorities()) {
- if (authority.getAuthority().equals(targetRole)) {
- shouldCheck = true ;
- break ;
- }
- }
- // if we should check IP, then check
- if (shouldCheck && allowedIPAddresses.size() > 0 ) {
- boolean shouldAllow = false ;
- for (String ipAddress : allowedIPAddresses) {
- if (req.getRemoteAddr().equals(ipAddress)) {
- shouldAllow = true ;
- break ;
- }
- }
- if (!shouldAllow) {
- // fail the request
- throw new AccessDeniedException(“Access has been
- denied for your IP address: “+req.getRemoteAddr());
- }
- }
- } else {
- logger.warn(“The IPRoleAuthenticationFilter should be placed
- after the user has been authenticated in the filter chain.”);
- }
- chain.doFilter(req, res);
- }
- // accessors (getters and setters) omitted
- }
你可以看到,代码很简单明了,使用 SecurityContext 来获得 Authentication 关于当前请求的信息,就像我们在前面的章节练习中所作的那样。你可能会意识到没有很多特定与 Spring Security 的东西,除了获取用户角色( GrantedAuthority )的方法以及使用了 AccessDeniedException 来标示访问被拒绝。
让我们看一下如何作为一个 Spring bean 配置自定义的过滤器。
配置 IP servlet 过滤器
配置这个过滤器作为一个简单的 Spring bean 。我们可以在 dogstore-base.xml 文件中配置它。
- < bean id = "ipFilter" class = "com.packtpub.springsecurity .security.IPRoleAuthenticationFilter" >
- < property name = "targetRole" value = "ROLE_ADMIN" />
- < property name = "allowedIPAddresses" >
- < list >
- < value > 1.2.3.4 </ value >
- </ list >
- </ property >
- </ 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 过滤器的配置如下:
需要记住的是我们的过滤器依赖于 SecurityContext 和 Authentication 对象,来进行辨别用户的 GrantedAuthority 。所以,我们要将这个过滤器的位置放在 FilterSecurityInterceptor 之前,它(你可能会回忆起第二章: Spring Security 起步 )负责确定用户是否有正确的权限访问系统。在过滤器的这个点上,用户的标示信息已经知道了,所以这是一个合适的位置以插入我们的过滤器。
现在你可以重启应用,因为这个新的 IP 过滤器,作为 admin 用户登录将会被限制。你可以对其进行随意的修改,以完全理解各部分是如何协同的。
【扩展 IP 过滤器。对于更复杂的需求,可以扩展这个过滤器以允许对角色和 IP 地址(子网匹配, IP 段等)更复杂的匹配。但是,在 java 中并没有广泛使用的类库来进行这种类型的计算——考虑到安全环境中普遍存在的 IP 过滤,这一点颇令人吃惊。】
尝试增强 IP 过滤器的功能以添加我们尚未描述到的功能——动手是学习的最好方法,而将练习改造成现实世界中的例子是将抽象概念变得具体的很好方式。
发表评论
-
spring-security3 配置和使用(二)承上
2011-12-22 06:42 10632、xml配置,配置内容如下: Xml代码 ... -
spring-security3 配置和使用 (一)(转载)
2011-12-22 06:43 957最近项目中要使用到spring-security,可能研究 ... -
SpringSecurity3.X--一个简单实现(转载)
2011-12-22 06:43 2676作者对springsecurity研究不深,算是个初学者吧,最 ... -
SpringSecurity3.X--验证码(转载)
2011-12-22 06:44 1069一般来说,登录时都会要求用户输入验证码,以防止恶意登录。 可 ... -
SpringSecurity3.X--前台与后台登录认证(转载)
2011-12-23 06:33 3460不过一般我们在管理系统时都会分前台与后台,也就是说,前台与后台 ... -
SpringSecurity3.X--remember-me(转载)
2011-12-22 06:44 1749笔者在SpringSecurity中配置remember-me ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-12-23 06:34 1345认证事件处理 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-12-23 06:34 1056Spring Security 基于bean 的高级配 ... -
《Spring Security3》第六章第五部分翻译(手动配置Spring Security设施的bean)(转载)
2011-12-23 06:34 1029手动配置Spring Security 设施的be ... -
《Spring Security3》第六章第四部分翻译(异常处理)(转载)
2011-12-23 06:34 1247理解和配置异常处理 ... -
《Spring Security3》第六章第三部分翻译(Session的管理和并发)(转载)
2011-12-24 10:20 4230Session 的管理和并发 ... -
《Spring Security3》第六章第二部分翻译(自定义AuthenticationProvider)(转载)
2011-12-24 10:21 1524实现自定义的 AuthenticationProvide ... -
《Spring Security3》第五章第四部分翻译(方法安全的高级知识和小结)(转载)
2011-12-24 10:22 1060方法安全的高级知 ... -
《Spring Security3》第五章第三部分翻译(保护业务层)
2011-12-24 10:22 892保护业务层 到目前为止,在 ... -
《Spring Security3》第五章第二部分翻译下(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 1029使用控制器逻辑进行有条件渲染内容 ... -
《Spring Security3》第五章第二部分翻译上(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 976实现授权精确控制的方法 精确的授权指的是基于用 ... -
《Spring Security3》第五章第一部分翻译(重新思考应用功能和安全) (转载)
2011-12-25 00:47 951第五章 精确的 ... -
《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)(转载)
2011-12-25 00:47 1267将 Remember me 功能 ... -
《Spring Security3》第四章第三部分翻译下(密码加salt)(转载)
2011-12-25 00:48 1814你是否愿意在密码上添加点salt ? 如果安 ... -
《Spring Security3》第四章第三部分翻译上(配置安全的密码)(转载)
2011-12-26 00:41 1031配置安全的密码 我们 ...
相关推荐
本章深入探讨了Spring Security3的内部机制,包括安全过滤器链、认证管理器(Authentication Manager)的工作原理以及如何定制这些组件以满足特定需求。 ### 第三章:高级安全特性 此章节涵盖了更高级的主题,如退出...
《Spring Security3》第二章第三部分的翻译下篇主要涵盖了Spring Security的核心概念和技术,这部分内容是深入理解Spring Security架构和实现安全控制的关键。在本章节中,我们将详细探讨以下几个核心知识点: 1. *...
自此之后,Spring Security 成为了 Spring 生态系统中的一个重要组成部分,不断迭代更新,以适应不断变化的安全需求和技术发展。 ##### 1.3 发行版本号 Spring Security 3.0.1 是在 Spring Security 3.0 的基础上...
- Spring Security 的核心是过滤器链,它包含了一系列安全过滤器,如`FilterSecurityInterceptor`和`AuthenticationProcessingFilter`。这些过滤器在请求处理前进行拦截,执行认证和授权操作。 3. **安全性配置**...
教程文档则可能深入到实践操作,包括如何配置Spring Security、创建第一个安全应用、调试和测试安全设置,以及如何解决常见问题。通过学习这套文档和教程,开发者可以掌握Spring Security的核心原理,从而为自己的...
- **Filter Chain**: SpringSecurity通过一系列过滤器实现其安全功能,这些过滤器构成了Filter Chain。每个过滤器负责特定的安全任务,如认证、授权等。 - **Authentication**: 表示用户的身份信息,包括用户名、...
在 Spring Security 中,安全性是通过一系列的过滤器来实现的。首先,我们需要在 Web 应用程序中配置 Spring Security 过滤器。这可以通过在 `web.xml` 文件中定义一个名为 `springSecurityFilterChain` 的过滤器来...
- **自定义过滤器配置**:可以针对特定场景定制过滤器的行为,如IP地址白名单过滤等。 综上所述,Spring Security3不仅提供了一整套强大的安全解决方案,还允许开发者根据具体的应用需求进行高度的定制化。无论是...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它为Web应用程序提供了全面的身份验证、授权和访问控制功能。在Spring Security 3版本中,这个框架进一步完善了其特性和性能,使其成为开发者...
Spring Security 是一个强大的安全框架,用于为Java应用提供全面的安全管理解决方案。它是Spring生态系统的组成部分,专注于身份验证、授权和访问控制。Spring Security的核心特性包括: 1. **身份验证...
4. **Filter Chain**:Spring Security通过一系列过滤器形成一个过滤链,每个过滤器都有特定的任务,如BasicAuthenticationFilter处理基本认证,RememberMeAuthenticationFilter处理记住我功能等。 5. **Session ...
- **过滤器链(Filter Chain)**:Spring Security的核心是其过滤器链,它由多个预定义的和自定义的过滤器组成,如`DelegatingFilterProxy`、`SecurityContextHolderAwareRequestFilter`等。这些过滤器按顺序执行,...
1. **过滤器链**:SpringSecurity的核心是基于过滤器的Web安全模型,它通过一系列预定义的过滤器(如`HttpSessionAuthenticationFilter`、`UsernamePasswordAuthenticationFilter`等)拦截HTTP请求,执行相应的安全...
它由四个主要组件组成:Filter Security Interceptor(过滤器安全拦截器)、Access Decision Manager(访问决策管理器)、Authentication Manager(认证管理器)和UserDetailsService(用户详情服务)。这些组件协同...
1. **SpringSecurity简介**:首先会介绍SpringSecurity的基本概念和架构,包括它如何通过层层过滤器保护Web应用,以及它提供的主要组件如Authentication(认证)和Authorization(授权)。 2. **配置SpringSecurity...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它提供了认证、授权和访问控制等功能,使得开发者可以轻松地在应用程序中实现复杂的安全需求。在这个名为 "mysecurity" 的压缩包中,很可能是...
其中,过滤器链是SpringSecurity处理请求的第一道防线,它会拦截所有HTTP请求并进行安全检查。 2. **集成过程**:在SpringMVC项目中集成SpringSecurity,首先需要在pom.xml文件中引入相应的依赖,接着配置Spring...
- 实例代码:通过运行和调试`springsecurity-sample`,你可以直观地看到每个安全配置在实际应用中的效果。 通过以上内容,你应该能对Spring Security有一个全面的了解,并能够着手开始你的权限管理项目。这个...
SpringSecurity 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在本示例中,我们将探讨如何使用 SpringSecurity 构建一个基本的认证和授权流程。 首先,Spring Security 的核心...
### 第一章:一个不安全应用的剖析 本章节通过分析一个不安全的应用案例,引出了安全审计的重要性,并对Spring Security的应用背景进行了介绍。 - **安全审计**:介绍了如何通过日志记录等方式来进行安全审计,以...