最近在看oauth的源码 ,发现 TokenEndpoint 这个类里面,/oauth/token 这个接口的第一个请求参数是接口Principal类型,实际上传过来的是UsernamePasswordAuthenticationToken类型,UsernamePasswordAuthenticationToken实现了Principal接口。

那么框架是在哪将请求参数封装成UsernamePasswordAuthenticationToken的呢?

如下图,首先打个断点,在方法调用栈里面,查看哪里给这个方法设置参数了。

oauth2 提供的接口/oauth/token,第一个参数是接口Principal,参数的实际类型是UsernamePasswordAuthenticationToken

一步步跟踪,会发现是在 InvocableHandlerMethod 的 invokeForRequest 方法里,通过反射调用,如下图:oauth2 提供的接口/oauth/token,第一个参数是接口Principal,参数的实际类型是UsernamePasswordAuthenticationToken

接下来只需要看 getMethodArgumentValues 这个方法做了什么就知道了。跟着图片一步步往下走,

oauth2 提供的接口/oauth/token,第一个参数是接口Principal,参数的实际类型是UsernamePasswordAuthenticationTokenoauth2 提供的接口/oauth/token,第一个参数是接口Principal,参数的实际类型是UsernamePasswordAuthenticationToken

ServletRequestMethodArgumentResolver.resolveArgument(...):

oauth2 提供的接口/oauth/token,第一个参数是接口Principal,参数的实际类型是UsernamePasswordAuthenticationToken

SecurityContextHolderAwareRequestWrapper.getUserPrincipal()

oauth2 提供的接口/oauth/token,第一个参数是接口Principal,参数的实际类型是UsernamePasswordAuthenticationToken

最后可以发现,是secutity 框架本身的 SecurityContextHolderAwareRequestWrapper 实例化参数Principal的。

相关文章:

  • 2021-07-08
  • 2021-06-29
  • 2021-06-23
  • 2021-08-26
  • 2022-02-12
  • 2021-06-09
  • 2022-12-23
  • 2021-05-20
猜你喜欢
  • 2021-04-04
  • 2021-08-30
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案