0

我的 login.jsp 上有一个自定义字段以及“ j_username”和“ j_password”,我需要对用户进行身份验证。我正在使用 CustomUsernamePasswordAuthenticationFilter 来访问自定义字段,如下所示。

public class CustomUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) {
        String myCustomField= request.getParameter("myCustomField");
        request.getSession().setAttribute("CUSTOM_FIELD", myCustomField);

        return super.attemptAuthentication(request, response); 
    }
}

我尝试在 UserDetailsS​​ervice 类的方法中访问会话,loadByUsername但出现错误。这是我的自定义 UserDetailsS​​ervice 的代码。

public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException,  DataAccessException {

         ServletRequestAttributes attr = (ServletRequestAttributes)RequestContextHolder.currentRequestAttributes();
         HttpSession session = attr.getRequest().getSession();
        User userObject = dbObject.retrieveUser(userName,myCustomParameter)
// code here to retrieve my user from the DB using the userName and myCustomParameter that was retrieved from login.jsp and put in the session. Get the custom parameter from the session here.

         if (userObject == null)
              throw new UsernameNotFoundException("user not found");

         return new AuthenticationUserDetails(userObject);
    }

有什么方法可以访问此自定义参数进行身份验证?通过会话发送它似乎不起作用。

4

2 回答 2

0

进行身份验证后不会创建会话。因此,在您调用 attemptAuthentication 之后,可能会创建一个新的经过身份验证的会话

这是您正在实现的 Abstract 类的 spring 文档

http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/web/authentication/AbstractAuthenticationProcessingFilter.html#successfulAuthentication%28javax.servlet.http.HttpServletRequest,%20javax .servlet.http.HttpServletResponse,%20org.springframework.security.core.Authentication%29

在调用 loadByUsername 时,您可能会丢失会话属性。

于 2012-05-31T18:12:33.930 回答
0

我遇到了确切的问题。

问题似乎是 RequestAttributes 没有绑定到当前线程。为了让它工作,我必须明确地将它绑定到当前线程。

CustomUsernamePasswordAuthenticationFilter, 在声明之后 request.getSession().setAttribute("CUSTOM_FIELD", myCustomField);

添加: RequestContextHolder.setRequestAttributes(new ServletRequestAttributes(request));

这对我有用。

于 2013-11-01T08:56:52.093 回答