(一) ExceptionTranslationFilter
Spring-security的异常拦截器:这个拦截器只拦截AuthenticationException和AccessDeniedException异常,其他异常直接抛出
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; try { chain.doFilter(request, response); logger.debug("Chain processed normally"); } catch (IOException ex) { 若捕获IOException直接抛出 throw ex; } catch (Exception ex) { // Try to extract a SpringSecurityException from the stacktrace Throwable[] causeChain = throwableAnalyzer.determineCauseChain(ex); //获取认证异常 RuntimeException ase = (AuthenticationException) throwableAnalyzer.getFirstThrowableOfType(AuthenticationException.class, causeChain); if (ase == null) { //若没有找到认证异常,就找授权异常 ase = (AccessDeniedException)throwableAnalyzer.getFirstThrowableOfType(AccessDeniedException.class, causeChain); } if (ase != null) { //处理spring-security抛出的异常 //1. 若是认证异常交给AuthenticationEntryPoint处理 //2. 若是授权异常交给AccessDeniedHandler处理 handleSpringSecurityException(request, response, chain, ase); } else { //省略… 抛出其他异常 } } }
AuthenticationEntryPoint
当用户请求了一个受保护的资源,但是用户没有通过认证,那么抛出异常,AuthenticationEntryPoint. Commence(..)就会调用
public interface AuthenticationEntryPoint { void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException; }
LoginUrlAuthenticationEntryPoint :跳转到登录页面
SavedRequest & RequestCache
在用户还为通过认证,访问了需要认证的资源,那么spring-security会保存当前的request,然后跳转到登录界面进行认证,在认证通过后,spring-security会跳转到保存的request;这个功能就是通过SavedRequest 和RequestCache 接口
1. SavedRequest:保存request的所有信息,默认的实现是DefaultSavedRequest
public interface SavedRequest extends java.io.Serializable { String getRedirectUrl(); List<Cookie> getCookies(); String getMethod(); List<String> getHeaderValues(String name); Collection<String> getHeaderNames(); List<Locale> getLocales(); String[] getParameterValues(String name); Map<String,String[]> getParameterMap(); }
2. RequestCache:默认的实现HttpSessionRequestCache,保存SavedRequest到session,
可以自己设置RequestMatcher,默认是AnyRequestMatcher
public interface RequestCache { void saveRequest(HttpServletRequest request, HttpServletResponse response); SavedRequest getRequest(HttpServletRequest request, HttpServletResponse response); HttpServletRequest getMatchingRequest(HttpServletRequest request, HttpServletResponse response); void removeRequest(HttpServletRequest request, HttpServletResponse response); }
AccessDeniedHandler
用户已经通过了认证,在访问一个受保护的资源,但是权限不够,那么抛出异常,AccessDeniedHandler. Handle(..)会调用
AccessDeniedHandlerImpl:若用户配置了权限不足的错误页面,那么就会跳转到错误页面;
若没有配置,那么就返回一个403
(二) SecurityContextPersistenceFilter
这个拦截器只完成两个任务:
1. 通过SecurityContextRepository获取到SecurityContext,默认是从session中获取,若没有找到,那么SecurityContextRepository就是创建一个空的,然后在通过SecurityContextHolder把获取到的SecurityContext保存到ThreadLocal
2. 在请求结束后通过SecurityContextHolder清除掉ThreadLocal中的SecurityContext
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; 确保这个拦截器一次请求只执行一次 if (request.getAttribute(FILTER_APPLIED) != null) { chain.doFilter(request, response); return; } //省略….. HttpRequestResponseHolder holder = new HttpRequestResponseHolder(request, response); 通过SecurityContextRepository获取SecurityContext,SecurityContextRepository默认是HttpSessionSecurityContextRepository SecurityContext contextBeforeChainExecution = repo.loadContext(holder); try { 默认SecurityContextHolder把SecurityContext保存到ThreadLocal中 SecurityContextHolder.setContext(contextBeforeChainExecution); chain.doFilter(holder.getRequest(), holder.getResponse()); } finally { SecurityContext contextAfterChainExecution = SecurityContextHolder.getContext(); // Crucial removal of SecurityContextHolder contents - do this before anything else. 清除SecurityContext,保存SecurityContext到session中 SecurityContextHolder.clearContext(); repo.saveContext(contextAfterChainExecution, holder.getRequest(), holder.getResponse()); request.removeAttribute(FILTER_APPLIED); } } }
(三) UsernamePasswordAuthenticationFilter
处理用户登录的拦截器,继承与AbstractAuthenticationProcessingFilter。
在AbstractAuthenticationProcessingFilter中的doFilter:
public void doFilter(ServletRequest req,ServletResponse res, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; //匹配url,通过RequestMatcher判断是否认证请求的url是指定结尾的,默认的结尾是/j_spring_security_check,所有在form表单提交的地址要以/j_spring_security_check结尾 if (!requiresAuthentication(request, response)) { chain.doFilter(request, response); return; } Authentication authResult; try { //调用子类UsernamePasswordAuthenticationFilter的attemptAuthentication方法 authResult = attemptAuthentication(request, response); if (authResult == null) { // return immediately as subclass has indicated that it hasn't completed authentication return; } sessionStrategy.onAuthentication(authResult, request, response); } catch(InternalAuthenticationServiceException failed) { // 在认证的过程中抛出了异常,那么就认证失败。 //从SecurityContextHolder清除掉SecurityContext; //AuthenticationFailureHandler处理后续操作,跳转到认证失败URL可以在security.xml中配置 //RememberMeServices 删除保存的cookie unsuccessfulAuthentication(request, response, failed); return; } catch (AuthenticationException failed) { // Authentication failed unsuccessfulAuthentication(request, response, failed); return; } // Authentication success //保存SecurityContext //RememberMeServices保存cookie //AuthenticationSuccessHandler 若有缓存到session中的URL,那么跳转,若没有,那么跳转到默认的URL,可以在security.xml中配置 successfulAuthentication(request, response, chain, authResult); }
UsernamePasswordAuthenticationFilter中的attemptAuthentication方法:
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException { //判断是否是POST请求,默认是要求必须是POST if (postOnly && !request.getMethod().equals("POST")) { throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod()); } //从request中解析出表单提交的username password,默认的参数名称是:j_username j_password String username = obtainUsername(request); String password = obtainPassword(request); //省略…… UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password); // Allow subclasses to set the "details" property setDetails(request, authRequest); //获取到AuthenticationManager调用authenticate方法进行认证 return this.getAuthenticationManager().authenticate(authRequest); }
相关推荐
3. **过滤器链**:Spring Security 的核心是Filter Security Interceptor(过滤器安全拦截器)和Access Decision Manager(访问决策管理器)。过滤器链处理HTTP请求,进行身份验证和授权检查,而访问决策管理器根据...
3. **Filter Chain**:Spring Security通过一系列过滤器(Filter)实现请求的拦截和处理。在3.1.0.RC1中,这些过滤器如`DelegatingFilterProxy`、`ChannelProcessingFilter`、`SecurityContextPersistenceFilter`等...
首先,`spring-security-web`是Spring Security的核心库,它提供了Web应用程序的基本安全功能,如HTTP安全过滤器链,登录页面处理,会话管理以及基于角色的访问控制(RBAC)。在`3.1.2`版本中,它包括了以下主要模块...
2. **spring-security-core**:这是Spring Security的基础模块,提供了安全核心服务,如安全性上下文、访问决策管理器、权限评估器等。它实现了基于角色的访问控制(RBAC)模型,处理用户、权限、角色等核心概念。 ...
这个zip包包含了Spring Security的核心库、文档、示例代码和其他必要的资源,便于开发者下载和学习。 Spring Security的主要功能包括: 1. **身份验证**:它提供了多种认证机制,如基于密码的认证、Remember Me...
1. **FilterSecurityInterceptor**:这是Spring Security中的关键拦截器,负责处理请求的访问控制。它通过SecurityMetadataSource获取访问控制信息,并调用AccessDecisionManager进行决策。 2. **Expression-Based ...
1. **过滤器链**:Spring Security的核心在于其过滤器链,它拦截HTTP请求并执行一系列安全检查。在3.0.5版本中,主要包括`DelegatingFilterProxy`、`ChannelProcessingFilter`、`SecurityContextPersistenceFilter`...
1. **Filter Security Interceptor (FSI)**:它是Spring Security的核心组件之一,负责拦截HTTP请求,并根据配置的安全规则进行处理。FSI使用访问决策管理器(Access Decision Manager)和权限表达式处理...
- **安全对象和 AbstractSecurityInterceptor**:安全拦截器实现了对业务层方法调用的安全性控制。 - **配置属性是什么?**:定义了 AbstractSecurityInterceptor 的配置属性。 - **RunAsManager**:负责执行 Run...
同时,实践编写安全拦截器、自定义过滤器以及处理异常状态也是掌握Spring Security的关键步骤。 总之,这个压缩包提供的资源可以帮助开发者深入了解和实践Spring Security 3.1,从而提升应用程序的安全性。无论是...
3. **Filter Chain**:Spring Security的核心在于其过滤器链,它在HTTP请求处理之前拦截请求并执行安全检查。`FilterSecurityInterceptor`是这个链上的关键组件,负责应用访问控制策略。 4. **UserDetailsService**...
- `FilterSecurityInterceptor`:AOP拦截器,负责进行访问控制,根据权限决定是否允许访问资源。 - `UserDetailsService`:获取用户详细信息的接口,通常与用户存储系统(如数据库或LDAP)集成。 - `...
3. **拦截器(Interceptors)**:Spring Security使用过滤器链(Filter Chain)来拦截和处理HTTP请求。这些过滤器执行身份验证、授权等安全任务。 4. **安全性配置(Security Configuration)**:基于XML或注解的...
1. **XML配置**:3.1.0.RELEASE版本中,Spring Security的配置主要通过XML文件完成,包括定义安全拦截规则、设置认证和授权策略等。 2. **注解驱动**:除了XML,3.1.0.RELEASE也支持使用Java配置和注解,使得配置...
3. URL过滤:通过使用FilterSecurityInterceptor,Spring Security可以拦截HTTP请求,检查用户是否具有访问特定URL的权限。它可以根据URL模式或Ant路径匹配规则进行配置。 4. CSRF(跨站请求伪造)防护:Spring ...
3. **过滤器链**:Spring Security 的核心是其过滤器链,它拦截 HTTP 请求并执行相应的安全逻辑。例如,`FilterSecurityInterceptor` 处理授权请求,而 `DelegatingFilterProxy` 用于配置 Spring 容器中的过滤器。 ...
- **Filter Chain**: Spring Security的核心是基于过滤器的HTTP请求处理链。它拦截每个HTTP请求,并根据预定义的安全策略进行处理,如身份验证、授权等。 - **AuthenticationManager**: 负责处理用户身份验证,...
从压缩包子文件"SpringSecurity(6).zip"的命名推测,这可能是系列教程或案例研究的第六部分,可能涉及到更深入的安全策略或特定场景的应用。 3. **SanGeng_Security_Project.zip** 另一个压缩文件"Sangeng_...
1. **Filter Chain**: Spring Security 使用一系列过滤器(Filter)来拦截 HTTP 请求,执行身份验证和授权检查。每个过滤器都有特定的任务,如 `UsernamePasswordAuthenticationFilter` 处理登录请求,`...
8. **集成Spring MVC**:在Spring Security 2.0.3中,它与Spring MVC的集成是关键,通过拦截器和安全注解来保护控制器方法。 9. **XML配置**:这个版本主要依赖XML配置,理解如何在`security-config.xml`中定义安全...