Spring安全自定义身份验证管理器与自定义提供程序vs自定义UserDetailsS​​ervice

时间:2014-04-29 22:56:53

标签: authentication spring-security customization

我几天来一直在反对这个问题,在网上看到几十个例子之后我就没有接近解决方案了。

我最终需要进行各种类型的登录。现在,我愿意接受一个。我想使用用户名和密码以外的字段登录。假设我想使用姓名,姓氏和生日。

我认为最简单的方法是实现我自己的UserDetailsS​​ervice并将其插入我的提供程序。但UserDetailsS​​ervice只有一个方法loadByUsername,这似乎不是加载我的用户最直观的方法。

那么我认为最好是实现我自己的AuthenticationProvider ...或者只是扩展DaoAuthenticationProvider,并覆盖authenticate()方法。但是该方法将身份验证作为参数...我可以使用POJO,只使用名称,姓氏和生日值字段作为身份验证对象吗?

同样适用于身份验证管理器。事实上,在AbstractUserDetailsAuthenticationProvider的api(authenticate()方法所在的api)中,它表示“使用与AuthenticationManager.authenticate(Authentication)相同的合同执行身份验证”

但人们似乎比经理人更多地实施供应商。奇怪的是,“自定义”提供程序和UserDetailsS​​ervices的大多数示例都使用用户名和密码实现身份验证,无论如何,Spring Security默认执行此操作!

任何人都可以对这个问题有所了解吗?正如我所说,有很多例子,但它们都非常相似,我找不到使用非用户名/密码的身份验证对象。

如果有人也可以告诉我拥有多个提供商/经理的最佳方式 - 例如,一个如上所述,另一个使用姓名和社会保险号进行身份验证,例如 - - 并且使用一个或另一个(不是两个,而不是第二个,如果第一个失败!),例如,取决于来自URL的参数传递。

1 个答案:

答案 0 :(得分:0)

我不确定你是否已经解决了这个挑战。但是,似乎我和你有类似的情况。我的登录页面需要额外的字段'组织'除了用户名'和密码'。这是我做的:

  1. 我使用过自定义AuthenticationManager和自定义UsernameAndPasswordAuthenticationFilter。
  2. 自定义过滤器用于从HttpServletRequest中检索附加字段。我将该字段添加到会话中并在自定义AuthenticationManager中检索它。
  3. 使用另一个bean / service对三个字段执行身份验证。
相关问题