普通账号密码登陆.md 1.6 KB

通过【从授权开始看源码】我们可以看到这里主要就是干了几件事情

  • 通过filter 确定登录要过滤的url
  • 通过filter 确定生成的AbstractAuthenticationToken 比如 UsernamePasswordAuthenticationToken
  • 通过生成的AbstractAuthenticationToken 确定AuthenticationProvider
  • 通过AuthenticationProvider 最后调用 authenticate()方法最后进行授权

我们把上面的流程再进行一次简化:

  • 通过filter确定登录请求的url
  • 授权

    ClientCredentialsTokenEndpointFilter.doFilter() 
    	--> AbstractAuthenticationProcessingFilter.attemptAuthentication()
    

根据上面我们对自己对代码进行了一些封装

我们先来看LoginAuthenticationFilter

ClientCredentialsTokenEndpointFilter.doFilter() 
	--> AbstractAuthenticationProcessingFilter.attemptAuthentication()
    --> YamiAuthenticationProcessingFilter.attemptAuthentication()
    --> LoginAuthenticationFilter.getUserDetails()

我们看几段比较重要的代码

public class LoginAuthenticationFilter extends YamiAuthenticationProcessingFilter {

    public LoginAuthenticationFilter(xxxx xxx){
        // 确定当url为/login时会被该Filter进行拦截
        super("/login");
    }
    
    // 这里写自定义登录的方法
    protected UserDetails getUserDetails(AuthenticationToken authentication) {
        // 使用手机号或账号登陆
        yamiUserDetailsService.loadUserByMobileOrUserName(userNameOrMobile, authentication.getAppType(),authentication.getLoginType());
        return user;
    }
}

通过上面的LoginAuthenticationFilter 即可实现简单的账号密码登录了