`
确实比较男
  • 浏览: 115583 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论
阅读更多

(一) 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);
    }

 

 小忆智库:http://xiaoyizhiku.net

2
0
分享到:
评论

相关推荐

    spring-security Jar包

    3. **过滤器链**:Spring Security 的核心是Filter Security Interceptor(过滤器安全拦截器)和Access Decision Manager(访问决策管理器)。过滤器链处理HTTP请求,进行身份验证和授权检查,而访问决策管理器根据...

    spring-security-core-3.1.0.RC1.jar

    3. **Filter Chain**:Spring Security通过一系列过滤器(Filter)实现请求的拦截和处理。在3.1.0.RC1中,这些过滤器如`DelegatingFilterProxy`、`ChannelProcessingFilter`、`SecurityContextPersistenceFilter`等...

    spring-security-oauth2与spring-security-web 3.1.2 源码

    首先,`spring-security-web`是Spring Security的核心库,它提供了Web应用程序的基本安全功能,如HTTP安全过滤器链,登录页面处理,会话管理以及基于角色的访问控制(RBAC)。在`3.1.2`版本中,它包括了以下主要模块...

    springsecurity所有jar包

    2. **spring-security-core**:这是Spring Security的基础模块,提供了安全核心服务,如安全性上下文、访问决策管理器、权限评估器等。它实现了基于角色的访问控制(RBAC)模型,处理用户、权限、角色等核心概念。 ...

    spring-security-3.1.4

    这个zip包包含了Spring Security的核心库、文档、示例代码和其他必要的资源,便于开发者下载和学习。 Spring Security的主要功能包括: 1. **身份验证**:它提供了多种认证机制,如基于密码的认证、Remember Me...

    spring-security-core-2.0.5.RELEASE.src

    1. **FilterSecurityInterceptor**:这是Spring Security中的关键拦截器,负责处理请求的访问控制。它通过SecurityMetadataSource获取访问控制信息,并调用AccessDecisionManager进行决策。 2. **Expression-Based ...

    spring-security-3.0.5.RELEASE

    1. **过滤器链**:Spring Security的核心在于其过滤器链,它拦截HTTP请求并执行一系列安全检查。在3.0.5版本中,主要包括`DelegatingFilterProxy`、`ChannelProcessingFilter`、`SecurityContextPersistenceFilter`...

    spring-security-4.0.3.RELEASE-全包

    1. **Filter Security Interceptor (FSI)**:它是Spring Security的核心组件之一,负责拦截HTTP请求,并根据配置的安全规则进行处理。FSI使用访问决策管理器(Access Decision Manager)和权限表达式处理...

    spring-security 官方文档 中文版

    - **安全对象和 AbstractSecurityInterceptor**:安全拦截器实现了对业务层方法调用的安全性控制。 - **配置属性是什么?**:定义了 AbstractSecurityInterceptor 的配置属性。 - **RunAsManager**:负责执行 Run...

    spring-security文档和jar包

    同时,实践编写安全拦截器、自定义过滤器以及处理异常状态也是掌握Spring Security的关键步骤。 总之,这个压缩包提供的资源可以帮助开发者深入了解和实践Spring Security 3.1,从而提升应用程序的安全性。无论是...

    spring-security-2.0.6. API和 jar包

    3. **Filter Chain**:Spring Security的核心在于其过滤器链,它在HTTP请求处理之前拦截请求并执行安全检查。`FilterSecurityInterceptor`是这个链上的关键组件,负责应用访问控制策略。 4. **UserDetailsService**...

    spring-security-3.0.3 jar包( 含源码)

    - `FilterSecurityInterceptor`:AOP拦截器,负责进行访问控制,根据权限决定是否允许访问资源。 - `UserDetailsService`:获取用户详细信息的接口,通常与用户存储系统(如数据库或LDAP)集成。 - `...

    spring-security-3.0.5.RELEASE 官方下载

    3. **拦截器(Interceptors)**:Spring Security使用过滤器链(Filter Chain)来拦截和处理HTTP请求。这些过滤器执行身份验证、授权等安全任务。 4. **安全性配置(Security Configuration)**:基于XML或注解的...

    spring-security-3.1.0.RELEASE

    1. **XML配置**:3.1.0.RELEASE版本中,Spring Security的配置主要通过XML文件完成,包括定义安全拦截规则、设置认证和授权策略等。 2. **注解驱动**:除了XML,3.1.0.RELEASE也支持使用Java配置和注解,使得配置...

    spring-security-2.0.4.zip

    3. URL过滤:通过使用FilterSecurityInterceptor,Spring Security可以拦截HTTP请求,检查用户是否具有访问特定URL的权限。它可以根据URL模式或Ant路径匹配规则进行配置。 4. CSRF(跨站请求伪造)防护:Spring ...

    spring-security-4.2.3.RELEASE

    3. **过滤器链**:Spring Security 的核心是其过滤器链,它拦截 HTTP 请求并执行相应的安全逻辑。例如,`FilterSecurityInterceptor` 处理授权请求,而 `DelegatingFilterProxy` 用于配置 Spring 容器中的过滤器。 ...

    spring-security-3.1.0.RELEASE.zip

    - **Filter Chain**: Spring Security的核心是基于过滤器的HTTP请求处理链。它拦截每个HTTP请求,并根据预定义的安全策略进行处理,如身份验证、授权等。 - **AuthenticationManager**: 负责处理用户身份验证,...

    ggj-spring-security

    从压缩包子文件"SpringSecurity(6).zip"的命名推测,这可能是系列教程或案例研究的第六部分,可能涉及到更深入的安全策略或特定场景的应用。 3. **SanGeng_Security_Project.zip** 另一个压缩文件"Sangeng_...

    Spring-Security_java_

    1. **Filter Chain**: Spring Security 使用一系列过滤器(Filter)来拦截 HTTP 请求,执行身份验证和授权检查。每个过滤器都有特定的任务,如 `UsernamePasswordAuthenticationFilter` 处理登录请求,`...

    spring-security-2.0.3

    8. **集成Spring MVC**:在Spring Security 2.0.3中,它与Spring MVC的集成是关键,通过拦截器和安全注解来保护控制器方法。 9. **XML配置**:这个版本主要依赖XML配置,理解如何在`security-config.xml`中定义安全...

Global site tag (gtag.js) - Google Analytics