spring security – 访问UserDetailsS​​ervice实现中的请求参数

我正在研究一个java spring mvc应用程序。 我已经实现了UserDetailsService接口,如下所示:

 @Component @Transactional public class SecurityDAO implements UserDetailsService{ @Override public UserDetails loadUserByUsername(final String username) throws UsernameNotFoundException { ... } .... } 

我需要在loadUserByUsername方法中找到用户登录URL(因为该项目有多个登录URL)。 实际上, 我想访问UserDetailsService实现中的请求参数。

只需在您的服务上注入请求:

  @Autowired private HttpServletRequest request; 

要使它工作,您需要先注册RequestContextListener,但:

 @Bean public RequestContextListener requestContextListener(){ return new RequestContextListener(); } 

所有信息都可以通过HttpServletRequest 。 您可以通过以下方式获取:

dependency injection

最简单的方法是将servlet请求直接注入到UserDetailsService: class中:

 public MyDetailsService implements UserDetailsService { @Autowired private HttpServletRequest request; //... } 

要么

 public MyDetailsService implements UserDetailsService { @Autowired private HttpServletRequest request; public UserDetails loadUserByUsername(String username){ HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()) .getRequest(); } } 

如果您不是春季启动,请记住将以下侦听器添加到您的web.xml

   org.springframework.web.context.request.RequestContextListener   

如果您使用的是弹簧靴,请在此处添加。

 @Bean public RequestContextListener requestContextListener(){ return new RequestContextListener(); } 

更新:这是有效的,因为Spring注入了实现HttpServletRequest特殊范围代理,因此您可以从singleton-scoped MyDetailsService访问请求范围的请求“bean”。 在引擎盖下,对request参数的每次调用都会被路由到org.springframework.web.context.request.RequestContextHolder#requestAttributesHolder ThreadLocal ,您也可以直接访问它。 正如您所看到的,Spring在确定范围规则时非常灵活。 它只是有效。

RequestContextHolder

另一种方法是使用RequestContextHolder

 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder. currentRequestAttributes()). getRequest(); 

进一步阅读:

  • 创建Spring bean包含ServletRequest属性
  • Spring:如何将HttpServletRequest注入请求范围的bean?

简单方法:1)注册RequestContextListener

 @Bean public RequestContextListener requestContextListener(){ return new RequestContextListener(); } 

2)到主要class级:

 HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder. currentRequestAttributes()). getRequest(); 

3)之后我们可以在自定义标题中使用参数:

 request.getHeader("OrganizationId") 

您可以通过以下方式获取当前请求

 HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()) .getRequest(); 

然后从那里访问请求参数。