当登录页面除了用户名和密码之外还有更多字段时,如何实现Spring安全性?


问题内容

我有一个登录页面,用户需要在其中输入以下信息VIN号,电子邮件,邮政编码和accessCode,它们将从不同的应用程序获取。

因此,要验证用户,我需要自定义UserDetailsService类中的所有信息,然后将调用一个过程来验证用户身份。

但是我看到当我实现UserDetailsService下面的代码时

@Component
 public class LoginService implements UserDetailsService {
@Autowired
LoginStoredProcedureDao loginStoredProcedureDao;

public Map<String, Object> verifyLogin(LoginDetails details) {
    return loginStoredProcedureDao.verifyLogin(details);

}
@Override
public UserDetails loadUserByUsername(String username)
        throws UsernameNotFoundException {
    // TODO Auto-generated method stub
      //verifyLogin();
    return null;
}

}

loginDetails对象如下所示

public class LoginDetails {
String vin;
String email;
String zipcode;
String accessCode;
}

在以上情况下如何使用spring安全。用户在这里需要提供所有信息以验证自己。


问题答案:

首先,我将以不同的方式解决您的问题。我会进行多步骤身份验证。第一个是使用spring
security的默认模型的传统用户名/密码登录。第二步是显示另一个表单,用户必须填写该表单以提供身份验证的其他详细信息,您的应用程序希望执行此操作。

无论如何,如果您想继续自定义spring安全模型,以单步询问登录的更多详细信息。请遵循@Petr中上一个答案中的步骤参考。然后要访问您的UserDetailsS​​ervice类中的会话属性,请使用Spring提供的http://static.springsource.org/spring/docs/2.0.8/api/org/springframework/web/context/request/RequestContextHolder.html类。

您可以访问currentRequestAttributes(),返回一个RequestAttributes对象。您可以查询RequestAttributes对象,以从所需范围中获取所需属性。

注意:这是静态方法,这意味着它对单元测试不友好。

您还可以将RequestAttributes转换为ServletRequestAttributes是否要访问基础HttpServletRequest

希望这可以帮助。