- 浏览: 298987 次
文章分类
最新评论
-
流年末年:
那四个参数还是没看懂.....能不能解释下showPassst ...
我写的密码强度验证方法(原创) -
kingcs2008:
// 验证pws.jsshowPassstrength(&qu ...
我写的密码强度验证方法(原创) -
h957355152:
请问博主这个怎么用呢?我直接放到jsp里面调用showPass ...
我写的密码强度验证方法(原创) -
qq_15138059:
我写的全国省市县三级联动菜单,拿出来和大家分享了(原创) -
valenon:
评论呢?从MAIL FROM命令开始貌似就出错了:500 Er ...
如何发送伪造的电子邮件
理解和配置异常处理
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-security3 配置和使用(二)承上
2011-12-22 06:42 9652、xml配置,配置内容如下: Xml代码 ... -
spring-security3 配置和使用 (一)(转载)
2011-12-22 06:43 864最近项目中要使用到spring-security,可能研究 ... -
SpringSecurity3.X--一个简单实现(转载)
2011-12-22 06:43 2616作者对springsecurity研究不深,算是个初学者吧,最 ... -
SpringSecurity3.X--验证码(转载)
2011-12-22 06:44 1009一般来说,登录时都会要求用户输入验证码,以防止恶意登录。 可 ... -
SpringSecurity3.X--前台与后台登录认证(转载)
2011-12-23 06:33 3381不过一般我们在管理系统时都会分前台与后台,也就是说,前台与后台 ... -
SpringSecurity3.X--remember-me(转载)
2011-12-22 06:44 1691笔者在SpringSecurity中配置remember-me ... -
《Spring Security3》第六章第七部分翻译(认证事件处理与小结)
2011-12-23 06:34 1248认证事件处理 ... -
《Spring Security3》第六章第六部分翻译(Spring Security基于bean的高级配置)
2011-12-23 06:34 1017Spring Security 基于bean 的高级配 ... -
《Spring Security3》第六章第五部分翻译(手动配置Spring Security设施的bean)(转载)
2011-12-23 06:34 966手动配置Spring Security 设施的be ... -
《Spring Security3》第六章第三部分翻译(Session的管理和并发)(转载)
2011-12-24 10:20 4194Session 的管理和并发 ... -
《Spring Security3》第六章第二部分翻译(自定义AuthenticationProvider)(转载)
2011-12-24 10:21 1431实现自定义的 AuthenticationProvide ... -
《Spring Security3》第六章第一部分翻译(自定义安全过滤器)(转载)
2011-12-24 10:21 1054第六章 高级配置和扩展 到目前为止,我 ... -
《Spring Security3》第五章第四部分翻译(方法安全的高级知识和小结)(转载)
2011-12-24 10:22 992方法安全的高级知 ... -
《Spring Security3》第五章第三部分翻译(保护业务层)
2011-12-24 10:22 847保护业务层 到目前为止,在 ... -
《Spring Security3》第五章第二部分翻译下(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 996使用控制器逻辑进行有条件渲染内容 ... -
《Spring Security3》第五章第二部分翻译上(实现授权精确控制的方法——页面级权限)(转载)
2011-12-25 00:47 895实现授权精确控制的方法 精确的授权指的是基于用 ... -
《Spring Security3》第五章第一部分翻译(重新思考应用功能和安全) (转载)
2011-12-25 00:47 920第五章 精确的 ... -
《Spring Security3》第四章第四部分翻译(Remember me后台存储和SSL)(转载)
2011-12-25 00:47 1213将 Remember me 功能 ... -
《Spring Security3》第四章第三部分翻译下(密码加salt)(转载)
2011-12-25 00:48 1737你是否愿意在密码上添加点salt ? 如果安 ... -
《Spring Security3》第四章第三部分翻译上(配置安全的密码)(转载)
2011-12-26 00:41 961配置安全的密码 我们 ...
相关推荐
第二章: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...