- 浏览: 453759 次
- 性别:
- 来自: 大连
博客专栏
-
《Spring Secur...
浏览量:384296
文章分类
最新评论
-
蒙奇君杰:
必须感谢一番!!!愿开源的态度为更多的人所拥有,所 认同!
关于对《Spring Security3》一书的翻译说明 -
601235723:
bbjavaeye 写道你好,有个问题请教一下我配了<b ...
《Spring Security3》第四章第一部分翻译下(自定义的UserDetailsService) -
bay0902:
中国互联网的脊梁
Spring Security 3全文下载 -
hdcustc:
项目源码下载 微博网盘里的那个依赖文件损坏了啊 能否提供个可 ...
Spring Security 3全文下载 -
i641878506:
楼主辛苦, 可以提供原书的原项目文件的下载么
Spring Security 3全文下载
理解和配置异常处理
Spring Security使用简单的分发器模式将框架抛出的异常转移到明确的处理行为中,这将会影响用户对安全资源的访问。Spring Security过滤器链中最后几个过滤器之一的o.s.s.web.access.ExceptionTranslationFilter负责检查在认证和授权过程中(在过滤器链的最后一个过滤器即FilterSecurityInterceptor里)抛出的异常并采取适当的行为。
标准的ExceptionTranslationFilter支持分发处理三种常规类型的失败,如下图所示:
我们能够看到ExceptionTranslationFilter处理如下的场景:
l 抛出AuthenticationException异常,用户需要登录(在大多数场景下——取决于AuthenticationEntryPoint,我们将会在本章稍后介绍);
l 抛出AccessDeniedException,用户已经尚未登录;
l 抛出AccessDeniedException,用户已经登录,在这种场景下,展现给用户的要么是出错页面,要么是通用的HTTP 403响应。
让我们看一下AccessDeniedHandler的配置。
配置“Access Denied”处理
到此为止,当一个认证过的用户访问受保护的资源时,因为缺少GrantedAuthority或其它需要的权限被拒绝的时候,他们看到的是servlet容器的默认HTTP 403(访问拒绝)页面。这个页面是o.s.s.web.access.AccessDeniedHandler默认行为的结果,它被ExceptionTranslationFilter所触发以响应框架抛出的一个AccessDeniedException异常。
尽管这个简单的出错页面有效,但是并不具有吸引力和也不对用户友好。最好能够将这个页面与我们站点整体的外观和风格一致,并为用户提供信息告诉他发生了什么。
基本的处理用户访问拒绝报告的方法是配置自定义的URL,Spring Security会在请求拒绝时,将用户带到这个URL。我们会发现这个功能与初始登录时,用户被定向到<form-login>元素声明的 login-page很类似。
配置“Access Denied”的目标地址
配置用户被定向到的地址是这个练习中最简单的部分。只需在<http>声明中,添加一个元素<access-denied-handler>,它指明了我们的访问拒绝处理URL,如下:
<http auto-config="true" ...> <access-denied-handler error-page="/accessDenied.do"/> </http>
注意——还没完事呢,因为我们还没有将这个URL与任何的Spring MVC应用代码关联起来。我们需要在LoginLogoutController添加增强代码以处理这个URL,并推送一些有用的信息到model中供view展现给用户。
添加对AccessDeniedException处理的控制器
我们需要添加一个控制器action处理方法以响应刚刚配置的URL。另外,我们会从AccessDeniedException抽取一些细节信息,这可能在用户看到我们自定义访问拒绝页面时有用。
@Controller public class LoginLogoutController extends BaseController{ // Ch 6 Access Denied @RequestMapping(method=RequestMethod.GET, value="/accessDenied.do"). public void accessDenied(ModelMap model, HttpServletRequest request) { AccessDeniedException ex = (AccessDeniedException) request.getAttribute(AccessDeniedHandlerImpl .SPRING_SECURITY_ACCESS_DENIED_EXCEPTION_KEY); StringWriter sw = new StringWriter(); model.addAttribute("errorDetails", ex.getMessage()); ex.printStackTrace(new PrintWriter(sw)); model.addAttribute("errorTrace", sw.toString()); } }
注意的是,需要引用AccessDeniedHandlerImpl来获取request中指定名字的属性,它被用来临时存储当前request范围内的异常。
遗憾的是,AccessDeniedException并没有在它的message中提供足够的细节信息,而这对系统管理员和用户本身可能会有用。你可能会对使用Spring Security的AccessDeniedException感兴趣或者可能扩展它以提供更多的上下文信息,以得到当授权检查不通过时用户正在试图进行什么操作。
编写Access Denied页面
控制器写好后,接下来是访问拒绝页面。
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <jsp:include page="common/header.jsp"> <jsp:param name="pageTitle" value="Access Denied"/> </jsp:include> <h1>Access Denied</h1> <p> Access to the specified resource has been denied for the following reason: <strong>${errorDetails}</strong>. </p> <em>Error Details (for Support Purposes only):</em><br /> <blockquote> <pre>${errorTrace}</pre> </blockquote> <jsp:include page="common/footer.jsp"/>
你可以看到我们使用了在控制器设置的模型属性errorDetails和errorTrace。尽管不是很漂亮,但是这个页面完成了它的任务即用通用的站点导航,将用户带到了站点的其它区域并给他们提供了导致出错的提示信息。
什么会触发AccessDeniedException
当设计异常处理时,进行一些分析并理解目标异常的原理很重要。对于Spring Security的用户来说,通常很迷惑的一件事就是AccessDeniedException(默认会导致HTTP 403页面)和AuthenticationException(一般当用户根本没有登录时抛出)。以下的指南可能会帮助你分清框架在什么时间抛出每种类型的异常:
异常类型 |
谁抛出以及原因 |
AuthenticationException |
AuthenticationProvider,当提供的凭证不合法或用户失效、过期; DaoAuthenticationProvider,当访问DAO数据存储时出错; RememberMeServices,当remember me cookie被篡改; 各种特定的认证类(CAS、NTLM等)在用户特定的场景下。 |
AccessDeniedException |
AccessDecisionManager,当配置的Voter投票拒绝访问——注意这可能在任何投票场景下 |
要记住的是,我们前面提到的ExceptionTranslationFilter是区分这两种类型异常的关键点,因为这关系到应用用户的请求和响应流程。
【注意过滤器链中在ExceptionTranslationFilter之前的那些过滤器。ExceptionTranslationFilter只会处理和响应过滤器链中在此之后的过滤器所抛出的异常。用户可能会感到迷惑,尤其是将自定义过滤器进行了不正确排序的时候,不明白为什么期望的行为与应用实际的异常处理不一致——在很多场景下,过滤器的顺序是原因所在。】
尽管内置的处理流程在大多数情况下是可预测且满足需要的,但有时候你会需要自定义异常处理,尤其是在引入基类异常的自定义子类时,这需要过滤器链的特殊处理。
AuthenticationEntryPoint的重要性
AuthenticationEntryPoint(在ExceptionTranslationFilter我们看到它是工作流程中的一个辅助类)在处理未认证用户请求中很重要。当ExceptionTranslationFilter确定用户需要认证时,它请求AuthenticationEntryPoint以了解下一步要做什么。在基于form的认证中,o.s.s.web.authentication.LoginUrlAuthenticationEntryPoint负责将用户定向到登录form。
我们将会在后面的章节中看到AuthenticationEntryPoint被用在各种认证机制中,从而实现更个性化的行为——例如,在中心认证服务(CAS)单点登录中,AuthenticationEntryPoint要确保用户被定向到CAS门户进行认证。
在很多环境下,当实现Spring Security与第三方认证系统(独立于web应用)集成时,你需要实现自己的AuthenticationEntryPoint。
发表评论
-
《Spring In Action》第三版译序
2013-07-12 12:19 3061《Spring In Action》第三 ... -
Tomcat源码解读系列(四)——Tomcat类加载机制概述
2012-09-23 22:23 10479声明:源码版本为Tomcat 6.0.35 ... -
Tomcat源码解读系列(三)——Tomcat对HTTP请求处理的整体流程
2012-09-09 22:34 6951声明:源码版本为Tomcat 6.0.35 前面的文章 ... -
Tomcat源码解读系列(二)——Tomcat的核心组成和启动过程
2012-09-02 16:59 6372声明:源码版本为Tom ... -
Tomcat源码解读系列(一)——server.xml文件的配置
2012-08-25 07:31 6470Tomcat是JEE开发人员最常用到的开发工具,在Jav ... -
Spring Security 3全文下载
2012-03-15 20:31 20415本书已经翻译完成,提供给大家下载 以下地址为ITEYE的电子 ... -
《Spring Security3》附录翻译(参考资料)
2012-02-13 22:58 6568附录:参考材料 在本附录中, ... -
《Spring Security3》第十三章翻译(迁移到Spring Security 3)
2012-02-13 22:50 5359第十三章 迁移到Spring Security 3 ... -
《Spring Security3》第十二章翻译(Spring Security扩展)
2012-02-13 22:38 8010第十二章 Spring Security扩展 ... -
《Spring Security3》第十一章(客户端证书认证)第二部分翻译
2012-02-13 22:23 4960在Spring Security中配置客户端证书认证 ... -
《Spring Security3》第十一章(客户端证书认证)第一部分翻译
2012-02-13 22:00 6216第十一章 客户端证书认证(Client Cert ... -
《Spring Security3》第十章(CAS)第二部分翻译(CAS高级配置)
2012-01-19 13:07 8631高级CAS配置 ... -
《Spring Security3》第十章(CAS)第一部分翻译(CAS基本配置)
2012-01-19 12:54 12350第十章 使用中心认证服务(CAS)进行单点登录 ... -
《Spring Security3》第九章(LDAP)第三部分翻译(LDAP明确配置)
2012-01-19 12:44 6455明确的LDAP bean配置 ... -
《Spring Security3》第九章(LDAP)第二部分翻译(LDAP高级配置)
2012-01-19 12:36 7209LDAP的高级配置 一旦我们 ... -
《Spring Security3》第九章(LDAP)第一部分翻译(LDAP基本配置)
2012-01-19 12:22 6182第九章 LDAP目录服务 在本章中,我们 ... -
《Spring Security3》第八章第三部分翻译(属性交换)
2012-01-18 15:46 2953属性交换(Attribute Exchange) ... -
《Spring Security3》第八章第二部分翻译(OpenID用户的注册)
2012-01-18 13:39 5415OpenID用户的注册问 ... -
《Spring Security3》第八章第一部分翻译(OpenID与Spring Security)
2012-01-17 22:38 7565第八章 对OpenID开放 OpenID是 ... -
《Spring Security3》第七章第三部分翻译(ACL的注意事项)
2012-01-17 22:25 2705典型ACL部署所要考虑的事情 ...
相关推荐
本章重点在于如何自定义Spring Security中的关键组件,如安全过滤器、`AuthenticationProvider`、会话管理和异常处理。此外,还涉及了如何手动配置Spring Security的bean以及基于bean的高级配置。 ### 第七章:访问...
自此之后,Spring Security 成为了 Spring 生态系统中的一个重要组成部分,不断迭代更新,以适应不断变化的安全需求和技术发展。 ##### 1.3 发行版本号 Spring Security 3.0.1 是在 Spring Security 3.0 的基础上...
《Spring Security3》第二章第三部分的翻译下篇主要涵盖了Spring Security的核心概念和技术,这部分内容是深入理解Spring Security架构和实现安全控制的关键。在本章节中,我们将详细探讨以下几个核心知识点: 1. *...
- Spring Security 无缝集成于Spring MVC框架,可以方便地与Spring MVC的其他特性配合使用,如异常处理和模型映射。 10. **Spring Boot集成**: - 在Spring Boot项目中,Spring Security 可以通过自动配置快速...
《Spring Security3》第四章第四部分主要探讨了Remember me服务的后台存储机制以及如何结合SSL(Secure Sockets Layer)来增强应用的安全性。这一部分的知识点涵盖了Spring Security中Remember me的功能,用户身份...
六、Spring Security 的架构 Spring Security 的架构主要包括以下几层: * Presentation Layer:负责用户交互,例如登录、登出等。 * Application Layer:负责业务逻辑,例如身份验证、授权等。 * Infrastructure ...
在"springsecurity学习笔记"中,你可能会涉及以下主题: - Spring Security的基本配置,包括web安全配置和全局安全配置。 - 如何自定义认证和授权流程,比如实现自定义的AuthenticationProvider和...
- Spring Security 3引入了CSRF(跨站请求伪造)防护,通过添加一个不可预测的令牌到表单提交中,防止恶意第三方发起未经授权的操作。 5. **国际化支持**: - 支持多语言界面,可以根据用户的首选语言显示错误...
Spring Security 3是中国社区翻译的官方文档,为国内开发者提供了方便的学习资源。 本套文档包含了Spring Security的基础概念、配置、核心组件以及实际应用场景的详细讲解。以下是一些关键知识点的概述: 1. **...
4. **会话管理(Session Management)**:Spring Security提供了强大的会话管理功能,可以限制同一用户同时在线的数量,检测会话劫持和会话固定攻击,并能实现会话超时策略。 5. **CSRF保护(Cross-Site Request ...
第二章:springsecurity起步 第三章:增强用户体验 第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用...
3. **SpringBoot整合SpringSecurity** - `spring-boot-starter-security`依赖:SpringBoot项目中添加此依赖即可自动配置SpringSecurity。 - 自定义登录页面:通过设置`loginPage`和`loginProcessingUrl`属性,可以...
### Spring Security3 相关知识点概述 #### 第一章:一个不安全应用的剖析 **安全审计** - **目的**:识别系统中的安全隐患,并评估安全措施的有效性。 - **过程**:通过模拟攻击来测试系统的安全性,分析日志记录...
在“spring security第一个项目”中,我们将探讨如何搭建一个基础的Spring Security环境,实现用户登录验证以及权限控制。 首先,我们需要理解Spring Security的基本架构。它由四个主要组件组成:Filter Security ...
SpringSecurity 是一个强大的且高度可定制的身份验证和访问控制框架,用于保护基于Java的应用程序。在本示例中,我们将探讨如何使用 SpringSecurity 构建一个基本的认证和授权流程。 首先,Spring Security 的核心...
Spring Security 是一个强大的和高度可定制的身份验证和...总的来说,Spring Security 3.x第五章的实例将帮助开发者深入理解这个框架的使用,通过具体的代码示例来实践安全性配置,从而更好地保护他们的Spring应用。
在SpringBoot Web开发中,SpringSecurity扮演着核心角色,负责处理身份验证、授权以及访问控制等方面的安全需求。狂神(秦疆)的教程以SpringBoot为基础,深入讲解了如何集成和使用SpringSecurity来构建安全的Web...
自定义Spring Security的身份验证失败处理方法 在 Spring Security 中,身份验证失败处理方法是一个非常重要的组件,它能够帮助我们处理身份验证失败的情况。然而,默认的身份验证失败处理方法并不总是能够满足我们...
3. **事件监听机制**:SpringSecurity使用Spring的事件驱动模型处理安全事件,如成功/失败的认证事件。 4. **配置解析**:查看`WebSecurityConfigurerAdapter`和`GlobalAuthenticationConfigurerAdapter`的源码,...