- 浏览: 446948 次
- 性别:
- 来自: 大连
博客专栏
-
《Spring Secur...
浏览量:379420
文章分类
最新评论
-
蒙奇君杰:
必须感谢一番!!!愿开源的态度为更多的人所拥有,所 认同!
关于对《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 2898《Spring In Action》第三 ... -
Tomcat源码解读系列(四)——Tomcat类加载机制概述
2012-09-23 22:23 10286声明:源码版本为Tomcat 6.0.35 ... -
Tomcat源码解读系列(三)——Tomcat对HTTP请求处理的整体流程
2012-09-09 22:34 6771声明:源码版本为Tomcat 6.0.35 前面的文章 ... -
Tomcat源码解读系列(二)——Tomcat的核心组成和启动过程
2012-09-02 16:59 6216声明:源码版本为Tom ... -
Tomcat源码解读系列(一)——server.xml文件的配置
2012-08-25 07:31 6290Tomcat是JEE开发人员最常用到的开发工具,在Jav ... -
Spring Security 3全文下载
2012-03-15 20:31 20108本书已经翻译完成,提供给大家下载 以下地址为ITEYE的电子 ... -
《Spring Security3》附录翻译(参考资料)
2012-02-13 22:58 6414附录:参考材料 在本附录中, ... -
《Spring Security3》第十三章翻译(迁移到Spring Security 3)
2012-02-13 22:50 5187第十三章 迁移到Spring Security 3 ... -
《Spring Security3》第十二章翻译(Spring Security扩展)
2012-02-13 22:38 7794第十二章 Spring Security扩展 ... -
《Spring Security3》第十一章(客户端证书认证)第二部分翻译
2012-02-13 22:23 4761在Spring Security中配置客户端证书认证 ... -
《Spring Security3》第十一章(客户端证书认证)第一部分翻译
2012-02-13 22:00 6118第十一章 客户端证书认证(Client Cert ... -
《Spring Security3》第十章(CAS)第二部分翻译(CAS高级配置)
2012-01-19 13:07 8572高级CAS配置 ... -
《Spring Security3》第十章(CAS)第一部分翻译(CAS基本配置)
2012-01-19 12:54 12217第十章 使用中心认证服务(CAS)进行单点登录 ... -
《Spring Security3》第九章(LDAP)第三部分翻译(LDAP明确配置)
2012-01-19 12:44 6379明确的LDAP bean配置 ... -
《Spring Security3》第九章(LDAP)第二部分翻译(LDAP高级配置)
2012-01-19 12:36 7081LDAP的高级配置 一旦我们 ... -
《Spring Security3》第九章(LDAP)第一部分翻译(LDAP基本配置)
2012-01-19 12:22 6100第九章 LDAP目录服务 在本章中,我们 ... -
《Spring Security3》第八章第三部分翻译(属性交换)
2012-01-18 15:46 2871属性交换(Attribute Exchange) ... -
《Spring Security3》第八章第二部分翻译(OpenID用户的注册)
2012-01-18 13:39 5317OpenID用户的注册问 ... -
《Spring Security3》第八章第一部分翻译(OpenID与Spring Security)
2012-01-17 22:38 7498第八章 对OpenID开放 OpenID是 ... -
《Spring Security3》第七章第三部分翻译(ACL的注意事项)
2012-01-17 22:25 2652典型ACL部署所要考虑的事情 ...
相关推荐
第二章:springsecurity起步 第三章:增强用户体验 第四章:凭证安全存储 第五章:精确的访问控制 第六章:高级配置和扩展 第七章:访问控制列表(ACL) 第八章:对OpenID开放 第九章:LDAP目录服务 第十章:使用...
第四部分 Web应用程序安全 112 13.安全过滤器链 112 13.1 DelegatingFilterProxy 112 13.2 FilterChainProxy 113 13.2.1绕过滤网链 115 13.3过滤器排序 115 13.4请求匹配和HttpFirewall 116 13.5与其他基于过滤器的...
第6章 Spring 2.x AOP和AspectJ支持 第二部分 基础主题 第7章 Spring对JDBC的支持 第8章 Spring中的事务管理 第9章 Spring对ORM的支持 第10章 Spring MVC框架 第11章 整合Spring...
本来是 fork 了 老师的源码的() 跟着学了两章后,发现还是少了点感觉,干脆自己重新码一遍吧 :beaming_face_with_smiling_eyes: 小目标 ...第4章 使用Spring Security开发基于表单的登录 4-1 简介 4-2
第6章 Spring 2.x AOP和AspectJ支持 第二部分 基础主题 第7章 Spring对JDBC的支持 第8章 Spring中的事务管理 第9章 Spring对ORM的支持 第10章 Spring MVC框架 第11章 整合Spring...
第4章 SpringSecurity安全详细讲解及应用 第5章 RabbitMQ高级消息的讲解及应用 第6章 ElasticSearch详细讲解及应用 第7章 Eureka分布式服务器的搭建 。。。。。。。。。 第15章 SpringCloud项目实战 。。。。。。。...
登录流程 1)容器启动(MySecurityMetadataSource:loadResourceDefine加载系统资源与权限列表) ... 执行第6步,否则执行第7步。 6)登录 7)验证并授权(MyUserDetailServiceImpl:loadUserByUsername) 内附完整数据库
第6章 Spring 2.x AOP和AspectJ支持 第二部分 基础主题 第7章 Spring对JDBC的支持 第8章 Spring中的事务管理 第9章 Spring对ORM的支持 第10章 Spring MVC框架 第11章 整合Spring与其他...
3. Spring Annotation Driven Core Tasks 4. Spring @MVC 5. Spring REST 6. Spring Deployment to the Cloud 7. Spring Social 8. Spring Security 9. Spring Mobile 10. Spring with other Web Frameworks 11. ...
第6章 将Spring与其他Web框架集成 209 6.1 在一般Web应用中访问Spring 209 6.1.1 问题 209 6.1.2 解决方案 210 6.1.3 工作原理 210 6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2...
第4章通知bean 4.1aop简介 4.1.1定义aop术语 4.1.2spring对aop的支持 4.2创建典型的spring切面 4.2.1创建通知 4.2.2定义切点和通知者 4.2.3使用proxyfactorybean 4.3自动代理 4.3.1为spring切面创建自动...
第6章 将Spring与其他Web框架集成 209 6.1 在一般Web应用中访问Spring 209 6.1.1 问题 209 6.1.2 解决方案 210 6.1.3 工作原理 210 6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2...
第4章 通知Bean 4.1 AOP简介 4.1.1 定义AOP术语 4.1.2 Spring对AOP的支持 4.2 创建典型的Spring切面 4.2.1 创建通知 4.2.2 定义切点和通知者 4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切...
第4章 通知Bean 4.1 AOP简介 4.1.1 定义AOP术语 4.1.2 Spring对AOP的支持 4.2 创建典型的Spring切面 4.2.1 创建通知 4.2.2 定义切点和通知者 4.2.3 使用ProxyFactoryBean 4.3 自动代理 4.3.1 为Spring切...
SpringBoot+Mybatis+SpringSecurity+Bootstrap+Layui开发java web轻量级小巧视频网站系统 项目描述 PC端+手机端模式自适应 支持本地资源视频文件上传在线播放,同时支持在线资源链接上传(ed2k、迅雷、等资源)...
(1)添加依赖: (2)配置文件 (3)创建页面 (4)添加访问入口 (5)添加 Spring Security 依赖 (6)进行分析
第4 章 Spring MVC 基础 72 4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 Spring MVC 基本配置 87 4.4.1 ...
第4 章 Spring MVC 基础 72 4.1 Spring MVC 概述 73 4.2 Spring MVC 项目快速搭建 74 4.2.1 点睛 74 4.2.2 示例 74 4.3 Spring MVC 的常用注解 82 4.3.1 点睛 82 4.3.2 示例 83 4.4 Spring MVC 基本配置 87 4.4.1 ...
Spring Cloud包含了多个子项目(针对分布式系统中涉及的多个不同开源产品),比如:Spring Cloud Config、Spring Cloud Netflix、Spring Cloud0 CloudFoundry、Spring Cloud AWS、Spring Cloud Security、Spring ...
第4 章 Spring MVC 基础 .... .......................... 72 第三部分 实战Spring Boot 第5 章 Spring Boot 基础 .... ......................... 122 第6 章 Spring Boot 核心 .... ......................... 138...