Filters:
ExceptionTranslationFilter:有两种异常抛出!
private void handleException(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
RuntimeException exception) throws IOException, ServletException {
if (exception instanceof AuthenticationException) {//如果是AuthenticationException的类型,直接发送到 sendStartAuthentication
if (logger.isDebugEnabled()) {
logger.debug("Authentication exception occurred; redirecting to authentication entry point", exception);
}
sendStartAuthentication(request, response, chain, (AuthenticationException) exception);
}
else if (exception instanceof AccessDeniedException) {
if (authenticationTrustResolver.isAnonymous(SecurityContextHolder.getContext().getAuthentication())) {
if (logger.isDebugEnabled()) {
logger.debug("Access is denied (user is anonymous); redirecting to authentication entry point",
exception);
}
sendStartAuthentication(request, response, chain, new InsufficientAuthenticationException(
"Full authentication is required to access this resource"));
}
else {
if (logger.isDebugEnabled()) {
logger.debug("Access is denied (user is not anonymous); delegating to AccessDeniedHandler",
exception);
}
accessDeniedHandler.handle(request, response, (AccessDeniedException) exception);
}
}
}
第一种:就是普通的授权异常了!AuthenticationException
1. 如果没有授权的访问,抛出 AuthenticationException的子类,判断它的类型为AuthenticationException之后,调用sendStartAuthentication方法去判断
protected void sendStartAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain,
AuthenticationException reason) throws ServletException, IOException {
// SEC-112: Clear the SecurityContextHolder's Authentication, as the
// existing Authentication is no longer considered valid
SecurityContextHolder.getContext().setAuthentication(null);
requestCache.saveRequest(request, response);
logger.debug("Calling Authentication entry point.");
authenticationEntryPoint.commence(request, response, reason);
}
清空SecurityContextHolder上下文中的Authentication , 然后委托给authenticationEntryPoint去发送分发页面!默认的是
LoginUrlAuthenticationEntryPoint(我们可在applicationContext.xml配置中,设置entry-point-ref="loginUrlAuthenticationEntryPoint",
这里的loginUrlAuthenticationEntryPoint是自定义的实现类)
<bean:bean id="loginUrlAuthenticationEntryPoint"
class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint"
p:loginFormUrl="/login/welcome"> <!-- 这里默认是DefaultLoginPageGeneratingFilter.DEFAULT_LOGIN_PAGE_URL? --> /spring_security_login是默认发送到的登录界面 -->
</bean:bean>
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException)
throws IOException, ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse = (HttpServletResponse) response;
String redirectUrl = null;
if (useForward) {//是否选择 Forward模式,如果不是,发送302重定向,跳转到 登录页面。默认为false.
if (forceHttps && "http".equals(request.getScheme())) {
redirectUrl = buildHttpsRedirectUrlForRequest(httpRequest);
}
if (redirectUrl == null) {
String loginForm = determineUrlToUseForThisRequest(httpRequest, httpResponse, authException);//提供给子类覆盖!,是否临时修改登录界面的URL.
if (logger.isDebugEnabled()) {
logger.debug("Server side forward to: " + loginForm);
}
RequestDispatcher dispatcher = httpRequest.getRequestDispatcher(loginForm);
dispatcher.forward(request, response);
return;
}
} else {
// redirect to login page. Use https if forceHttps true
redirectUrl = buildRedirectUrlToLoginPage(httpRequest, httpResponse, authException);//创建重定向URL
}
httpResponse.sendRedirect(httpResponse.encodeRedirectURL(redirectUrl));
}
第二种:是访问资源被Denied的异常,AccessDeniedException
分享到:
相关推荐
标题 "springMVC+springSecurity3.0+maven" 指的是一个集成项目,它结合了Spring MVC、Spring Security 3.0和Maven这三个关键的Java开发工具和技术。让我们逐一深入理解这些技术及其相互之间的关系。 首先,Spring ...
本文档所指的版本为 Spring Security 3.0.1,这是一个 bug fix 版本,主要针对 3.0 版本中存在的问题进行修复,确保开发者能够获取更稳定可靠的 Spring Security 库。 **1.4 获取 Spring Security** - **项目模块*...
Spring Security 是一个强大的安全框架,主要用于Java应用的安全管理。它为Web应用程序提供了全面的身份验证、授权和访问控制功能。在Spring Security 3版本中,这个框架进一步完善了其特性和性能,使其成为开发者...
### Spring Security 3.0 入门与核心概念详解 #### 一、Spring Security简介 Spring Security 是一款功能强大且高度可定制的应用安全框架,它为基于 Java 的应用程序提供了全面的安全服务。尤其对于那些采用 ...
3. 使用Spring Security来保护应用程序的安全性,防止未授权访问。 4. 在Spring Boot和JavaScript应用之间实现会话管理,例如通过JWT(JSON Web Tokens)进行身份验证。 5. 如何利用Spring的ModelAndView或...
在Spring 3.0版本中,引入了更多的模块,如Spring MVC用于处理HTTP请求,Spring Security用于权限管理,以及Spring Batch用于批量处理等。Spring的核心优势在于其松耦合和模块化设计,使得开发者可以灵活选择需要的...
Spring MVC是Spring框架的一个重要组成部分,它提供了模型-视图-控制器(MVC)架构,使开发者能够将业务逻辑、数据处理和用户界面有效地分离,从而实现更高效、可维护的代码结构。 在Spring MVC中,核心概念包括...
- **版本标识:** Spring Security 3.0.1 是对3.0版本的一个bug修复版本,主要针对3.0中已知的问题进行修复。 - **版本控制:** 2010年之后,项目的版本控制从SVN切换到了Git。 **1.4 获取 Spring Security** - **...
Spring Security 3.0.1是一个bug fix版本,主要目的是修正3.0版本中出现的一些问题,而不包含任何新功能。尽管如此,这一版本的更新仍然很重要,因为它增强了框架的稳定性和安全性。 在Spring Security的项目结构中...
Struts2、Spring2.5和Hibernate3.0是Java Web开发中三个非常重要的框架,它们各自负责不同的职责...在实际项目中,还可以结合其他技术和工具,如MyBatis、AspectJ、Spring Security等,进一步完善系统的功能和安全性。
6. 安全性考虑:可能需要整合Spring Security或其他安全框架,以保护应用程序免受未经授权的访问。 7. 测试:编写单元测试和集成测试,确保每个部分的功能正常,同时优化性能和响应时间。 通过这个整合,开发者...
本文将深入探讨如何基于Spring Boot 3.0、Spring Cloud 2022 & Alibaba以及SAS OAuth2实现一个强大的微服务RBAC(Role-Based Access Control)权限管理系统。 首先,Spring Boot 3.0是Java开发领域中备受推崇的框架...
登录时,可能会使用Spring Security进行权限验证。发布信息则涉及Hibernate的持久化操作,比如创建新的帖子、回复等,这些操作需要在事务内完成,以防止数据不一致。 项目的结构通常包含以下几个部分: 1. **Model*...
教程将涵盖SpringBoot的配置管理、RESTful API设计、数据库集成(如MyBatis或JPA)以及Spring Security的使用等内容。 Vue3则是Vue.js框架的最新迭代,带来了许多性能优化和设计上的改进。Vue3引入了Composition ...
Spring Security 3.2 提供了对Servlet 3.0 API的支持,增强了Remember-Me服务,改进了CSRF防护,以及更灵活的权限控制机制。 这个整合包的使用意味着你可以快速搭建一个具有用户认证和授权、数据持久化、Web请求...
此外,还可以深入研究Spring Security、Spring AOP等Spring模块,提升Web应用的安全性和可维护性。 通过这个Spring 3.0 MVC入门模板,开发者可以快速上手,体验Spring MVC的高效和便利,为后续的Web开发打下坚实的...
本指南的前半部分将介绍Spring Security 3.0的基础知识,包括项目的背景和发展历程,以及如何开始在项目中使用该框架。此外,还将探讨Spring Security的命名空间配置,这种方式提供了一种更简单的方法来替代传统的...