认证功能实现(spring security)

2020-11-25  本文已影响0人  do_young

背景

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

认证流程

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

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

image.png
上一篇下一篇

猜你喜欢

热点阅读