在自定义 AuthenticationProvider 中访问 HttpServletRequest

问题描述 投票:0回答:3

如何在自定义 AuthenticationProvider 中访问 HttpServletRequest。我试过这样做

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();

HttpServletRequest request = ((ServletRequestAttributes) requestAttributes).getRequest();
String username = (String) httpReq.getAttribute("j_username");

RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
HttpServletRequest httpReq = ((ServletRequestAttributes)RequestContextHolder.currentRequestAttributes()).getRequest();

String username = (String) httpReq.getAttribute("j_username");

我的用户名为空

但是

RequestContextHolder.getRequestAttributes();
返回
null

我想引用请求上下文,将其传入,或者让 Spring 发挥其魔力,以便我可以引用它。

我还在我的 web.xml 中提供了 RequestContextListener

  <listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>

我已经搜索了安全论坛,但仍然没有找到任何东西。

提前致谢。

spring-mvc spring-security
3个回答
9
投票

我刚刚将侦听器添加到我的 web.xml 中,RequestContextHolder.getRequestAttributes() 返回 RequestAttributes 而不是 null。

<listener>
  <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

如果您想自定义登录表单,为什么不扩展此过滤器:org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter


0
投票

我已经在3.3版本上测试过。

  1. 添加
    RequestContextFilter
.addFilterBefore(new RequestContextFilter(), myFilter)
  1. 注册
    RequestContextListener
@Configuration
public class WebConfig {

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

和上面的答案是一样的方法,不过是用java配置。


-3
投票

使用 request.getParameter("j_username");而不是 request.getAttribute("j_username");

这对我有用。 看看对你有没有帮助。

© www.soinside.com 2019 - 2024. All rights reserved.