更新:
clientId和clientSecret可以直接用Base64加密后放在请求头中,一样可以请求到token
对密码模式来说,首先需要验证client和secret,然后才是验证用户名和密码,这两个流程逻辑上很相似,都是通过 某个provider 来进行验证,验证通过后会生成一个Authentication,默认情况不客制化的时候,甚至都会通过同一个provider:DaoAuthenticationProvider 来进行验证,只不过其中默认的UserDetailsService不同罢了。
我们都知道了/oauth/token接口是在TokenEndPoint.java里的,用户名和密码的验证逻辑也是从这里发起,而client的验证在这之前已经完成了。
client的验证是在过滤器中的,具体我们可以看xml中的配置:

ClientCredentialsTokenEndpointFilter的doFilter()方法被调用(其实是它父类的该方法吗,因为它没有重写)
后面调用了一系列方法,最后在DaoAuthenticationProvider.java的additionalAuthenticationChecks()方法中完成对client和secret的验证
划重点!!!!!!!!!!!!!

值得一提的是验证完成之后,生成的Authentication会被带到TokenEndPoint的接口中,应该是以参数Principal的形式传入。
oauth2提供了很多默认的配置,在查找的时候比较费力,例如上面验证的provider,xml中的配置如下:

对于图中红框的配置,是默认使用了DaoAuthenticationProvider ,我们也可以显示地指定如下:
