spring security – 访问UserDetailsService实现中的请求参数
我正在研究一个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();
然后从那里访问请求参数。