美文网首页
认证功能实现(spring security)

认证功能实现(spring security)

作者: do_young | 来源:发表于2020-11-25 13:13 被阅读0次

    背景

    前面分析过关于系统认证相关的术语,这里说明一下认证在web应用中的实现,以即spring security对认证的实现。

    认证流程

    • 用户使用客户端(比如:浏览器),通过HTTP的URL,访问应用资源。
    • 应用根据请求信息(比如:sessionId)判断用户是否认证。
    • 如果没有认证,则跳转到登录界面,要求用户填入认证信息进行认证。
    • 用户输入认证信息,进行认证,认证通过以后,应用给用户一个系统凭证。
    • 用户后续请求带系统凭证(比如:sessionId,token)等,访问应用资源。

    spring security对认证的实现

    认证配置

    spring security通过对封装的HttpSecurity对象做以下配置,就可以实现上述的认证流程。

            http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .addFilter(UsernamePasswordAuthenticationFilter.class)
        。。。。。。
    

    源码分析

    首先,spring security继承于GennericFilterBean,实现了一个过滤器UsernamePasswordAuthenticationFilter

    image.png

    这个过滤器的作用就是基于用户输入的认证信息,封装为一个认证信息对象进行认证。
    如下所示:

        public Authentication attemptAuthentication(HttpServletRequest request,
                HttpServletResponse response) throws AuthenticationException {
            if (postOnly && !request.getMethod().equals("POST")) {
                throw new AuthenticationServiceException(
                        "Authentication method not supported: " + request.getMethod());
            }
    
            String username = obtainUsername(request);
            String password = obtainPassword(request);
    
            if (username == null) {
                username = "";
            }
    
            if (password == null) {
                password = "";
            }
    
            username = username.trim();
    
            UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
                    username, password);
    
            // Allow subclasses to set the "details" property
            setDetails(request, authRequest);
    
            return this.getAuthenticationManager().authenticate(authRequest);
        }
    

    其中最重要的就是调用AuthenticationManager接口了,这个接口就是针对不同的认证信息,进行不同的认证处理。

        Authentication authenticate(Authentication authentication)
                throws AuthenticationException;
    
        boolean supports(Class<?> authentication);
    

    相关的接口及实现类如下图所示:

    image.png
    • AuthenticationManager是认证行为管理的抽象接口。
    • ProviderManager是对认证行为管理的实现,其中存储了一个认证行为集合。
    • AuthenticationProvider是对认证行为的抽象接口。
    • AbstractAuthenticationProvider是对认证行为的抽象实现,其中逻辑是通过用户详情接口(UserDetails)获取用户信息。
    • DaoAuthenticationProvider是对AbstractAuthenticationProvider抽象类的实现,实现了从数据库中获取用户信息。

    AuthenticationProvider 还有很多的认证行为的实现类,如下图所示:

    image.png

    相关文章

      网友评论

          本文标题:认证功能实现(spring security)

          本文链接:https://www.haomeiwen.com/subject/xipgiktx.html