当登录页面除了用户名和密码之外还有更多字段时,如何实现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中上一个答案中的步骤参考。然后要访问您的UserDetailsService类中的会话属性,请使用Spring提供的http://static.springsource.org/spring/docs/2.0.8/api/org/springframework/web/context/request/RequestContextHolder.html类。
您可以访问currentRequestAttributes()
,返回一个RequestAttributes
对象。您可以查询RequestAttributes对象,以从所需范围中获取所需属性。
注意:这是静态方法,这意味着它对单元测试不友好。
您还可以将RequestAttributes转换为ServletRequestAttributes
是否要访问基础HttpServletRequest
希望这可以帮助。