`
Dead_knight
  • 浏览: 1201044 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
博客专栏
752c8642-b795-3fe6-946e-a4e845bffdec
Spring Securi...
浏览量:240223
33caa84e-18a6-3036-a82b-6e2106a4de63
clojure专题
浏览量:48924
E17ca077-44df-3816-a3fe-471c43f6e1e5
WebLogic11g
浏览量:236878
社区版块
存档分类
最新评论

Spring Security3源码分析-BasicAuthenticationFilter分析

阅读更多
BasicAuthenticationFilter过滤器对应的类路径为
org.springframework.security.web.authentication.www.BasicAuthenticationFilter

Basic验证方式相比较而言用的不是太多。spring security也支持basic的方式,配置如下
<security:http auto-config="true">
    <!-- <security:form-login login-page="/login.jsp"/>-->
    <security:http-basic/>
    <security:logout logout-success-url="/login.jsp" invalidate-session="true"/>
    <security:intercept-url pattern="/login.jsp*" filters="none"/>
    <security:intercept-url pattern="/admin.jsp*" access="ROLE_ADMIN"/>
    <security:intercept-url pattern="/index.jsp*" access="ROLE_USER,ROLE_ADMIN"/>
    <security:intercept-url pattern="/**" access="ROLE_USER,ROLE_ADMIN"/>
</security:http>

如果选择basic方式,需要把form-login标签的定义给注释掉。

接下来看BasicAuthenticationFilter的执行过程
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        final boolean debug = logger.isDebugEnabled();
        final HttpServletRequest request = (HttpServletRequest) req;
        final HttpServletResponse response = (HttpServletResponse) res;
        //basic登录时,会产生Authorization的header信息
         //Authorization的值是Basic eXVxaW5nc29uZzox
        //eXVxaW5nc29uZzox是经过base编码的一串字符
        String header = request.getHeader("Authorization");
        if ((header != null) && header.startsWith("Basic ")) {
            byte[] base64Token = header.substring(6).getBytes("UTF-8");
            //经过base解码后,token值为username:password这种方式
            String token = new String(Base64.decode(base64Token), getCredentialsCharset(request));
            String username = "";
            String password = "";
            int delim = token.indexOf(":");

            if (delim != -1) {
                username = token.substring(0, delim);
                password = token.substring(delim + 1);
            }

            if (debug) {
                logger.debug("Basic Authentication Authorization header found for user '" + username + "'");
            }
            //下面的执行过程基本和login方式一样,认证、授权等过程
            if (authenticationIsRequired(username)) {
                UsernamePasswordAuthenticationToken authRequest =
                        new UsernamePasswordAuthenticationToken(username, password);
                authRequest.setDetails(authenticationDetailsSource.buildDetails(request));

                Authentication authResult;

                try {
                    authResult = authenticationManager.authenticate(authRequest);
                } catch (AuthenticationException failed) {
                    // Authentication failed
                    if (debug) {
                        logger.debug("Authentication request for user: " + username + " failed: " + failed.toString());
                    }

                    SecurityContextHolder.getContext().setAuthentication(null);

                    rememberMeServices.loginFail(request, response);

                    onUnsuccessfulAuthentication(request, response, failed);

                    if (ignoreFailure) {
                        chain.doFilter(request, response);
                    } else {
                        authenticationEntryPoint.commence(request, response, failed);
                    }

                    return;
                }

                // Authentication success
                if (debug) {
                    logger.debug("Authentication success: " + authResult.toString());
                }

                SecurityContextHolder.getContext().setAuthentication(authResult);

                rememberMeServices.loginSuccess(request, response, authResult);

                onSuccessfulAuthentication(request, response, authResult);
            }
        }

        chain.doFilter(request, response);
    }
2
2
分享到:
评论

相关推荐

    spring security源码分析.pdf

    ### Spring Security 源码分析知识...以上内容涵盖了 Spring Security 3 的源码分析中几个关键点的具体内容。通过对这些内容的深入学习和理解,可以更好地掌握 Spring Security 的工作原理及其在实际项目中的应用技巧。

    spring-security-3.1.0.RELEASE

    3. **过滤器链**:Spring Security的核心在于它的过滤器链,包括BasicAuthenticationFilter、RememberMeAuthenticationFilter等,它们在HTTP请求处理过程中介入,实现认证和授权。 二、配置与定制 1. **XML配置**...

    springsecurity学习笔记

    4. **Filter Chain**:Spring Security通过一系列过滤器形成一个过滤链,每个过滤器都有特定的任务,如BasicAuthenticationFilter处理基本认证,RememberMeAuthenticationFilter处理记住我功能等。 5. **Session ...

    Spring Security详细介绍及使用含完整代码(值得珍藏)

    ### Spring Security详细介绍及使用 #### 一、Spring Security概述 Spring Security是一款强大的安全框架,它专为基于Spring的企业级应用提供了声明式安全访问控制。该框架利用Spring框架的核心功能,如IoC...

    Spring Security3 安全 个人总结

    Spring Security3 安全个人总结 Spring Security3 是一个基于 Java 的安全框架,提供了一个灵活的安全机制来保护基于 Spring 的应用程序。在这个总结中,我们将详细介绍 Spring Security3 的安全机制、原理和核心...

    Spring Security 2 中文参考文档(chm)

    **Spring Security 2 中文参考文档** Spring Security是一款强大的安全框架,主要用于Java应用程序的安全管理。在Spring Security 2版本中,它提供了丰富的功能,包括身份验证、授权、访问控制以及安全相关的会话...

    狂神Spring Security静态资源

    3. **使用Spring Security的访问决策管理器(AccessDecisionManager)**:如果你希望控制哪些角色可以访问静态资源,可以实现自己的访问决策管理器,然后在配置中指定使用这个管理器。 4. **使用HTTP基本认证或OAuth2...

    Spring_Security3_源码分析

    本文将深入剖析Spring Security 3的源码,揭示其核心组件和工作流程。 1. **FilterChainProxy初始化**:FilterChainProxy是Spring Security的核心过滤器链,它负责根据配置定义的过滤器顺序执行安全检查。在启动时...

    Spring Security参考手册中文版

    ### Spring Security 参考手册知识点概览 #### 一、Spring Security 概述 - **定义**:Spring Security 是一个强大的、高度可定制的身份验证和访问控制框架。 - **历史**:Spring Security 随着 Spring 框架的发展...

    spring security简单示例

    Spring Security的源码是开源的,你可以深入研究其内部工作原理,了解每个组件是如何协同工作的。这将帮助你更好地理解和定制这个框架。 7. **工具**: - Spring Security的官方文档和教程是学习的重要资源。 - ...

    springboot-springsecurity-jwt-demo

    [输入图片说明](https://gitee.com/uploads/images/2018/0211/154308_9576ce90_130820.png "jwt-3.png") 4.用登录成功后拿到的token再次请求/users/userList接口 4.1将请求中的XXXXXX替换成拿到的token ...

    spring security 参考手册中文版

    3. Spring Security 4.2的新特性 27 3.1 Web改进 27 3.2配置改进 28 3.3杂项 28 4.样品和指南(从这里开始) 28 5. Java配置 29 5.1 Hello Web安全Java配置 29 5.1.1 AbstractSecurityWebApplicationInitializer 31 ...

    SpringSecurity3.1实际摸索总结

    3. 配置 `spring-security.xml`,定义安全规则,如访问控制、认证机制等。 在 `spring-security.xml` 中,你可以使用 `&lt;http&gt;` 元素定义 URL 的安全策略,使用 `&lt;authentication-manager&gt;` 配置认证机制,以及使用 ...

    我的SpringSecurity实践

    这篇博文的作者通过实际操作分享了他在使用SpringSecurity时的经验,虽然描述中并未给出具体细节,但我们可以从标题和标签中推测,本文可能涉及了SpringSecurity的源码分析和工具的使用。 SpringSecurity的核心概念...

    spring security2配置

    7. **过滤器链**:Spring Security通过一系列过滤器处理HTTP请求,如`HttpSessionAuthenticationStrategy`用于会话管理,`BasicAuthenticationFilter`处理基本认证,`CsrfFilter`防止跨站请求伪造等。 8. **状态...

    spring-boot-security-basic-demo:spring-boot-security的基础功能例子

    3. 访问控制:Spring Security的`@Secured`和`@PreAuthorize`注解可以用来标记方法,限制只有具有特定权限的用户才能执行。此外,还可以通过配置HTTP安全设置来控制对URL的访问,比如使用`antMatchers`和`hasRole`。...

    SpringSecurity企业及认证全套开发资源.docx

    无论是源码解读、拦截器链分析,还是第三方登录集成、短信验证与登录,甚至是自定义验证授权设计模式,Spring Security都能满足不同场景下的需求。对于希望深入了解Spring Security的企业开发者而言,这份资源文档将...

    用SpringSecurity保护Web的安全

    SpringSecurity 是一个强大的Java安全框架,用于保护Web应用程序免受各种攻击。在SpringSecurity 3.1版本中,相比3.0版本,配置上有一些变化,但其核心仍然是通过一系列过滤器来实现安全控制。本文将详细介绍Spring...

    翻译 Spring Security - Tutorial: Adding Security to Spring Petclinic

    此外,Spring Security 提供了丰富的过滤器链,如 `UsernamePasswordAuthenticationFilter` 和 `BasicAuthenticationFilter`,它们处理用户的登录请求。这些过滤器可以根据需求进行自定义和配置。 至于 `c exercise...

Global site tag (gtag.js) - Google Analytics