认证功能实现(spring security)

背景

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

认证流程

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

spring security对认证的实现

认证配置

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

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

源码分析

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

认证功能实现(spring security)_第1张图片
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);

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

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

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

认证功能实现(spring security)_第3张图片
image.png

你可能感兴趣的:(认证功能实现(spring security))