【问题标题】:Spring secutiry custom authentication manager vs custom provider vs custom UserDetailsServiceSpring Security 自定义身份验证管理器 vs 自定义提供者 vs 自定义 UserDetailsS​​ervice
【发布时间】:2014-06-16 02:31:49
【问题描述】:

我这几天一直在努力解决这个问题,在网上看到了几十个例子之后,我离解决方案更近了。

我最终需要进行各种类型的登录。现在我会满足于一个。我想使用用户名和密码以外的字段登录。假设我想使用姓名、姓氏和生日。

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

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

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

但人们似乎比管理器更多地实施提供者。奇怪的是,“自定义”提供者和 UserDetailsS​​ervices 的大多数示例......都使用用户名和密码实现身份验证,这是 Spring Security 默认情况下所做的!

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

如果有人还可以告诉我拥有多个提供者/经理的最佳方式(例如,如上所述的一个,以及使用姓名和社会保险号进行身份验证的另一个),则奖励积分,例如 - - 并使用一个或另一个(不是两者,如果第一个失败,则不是第二个!)取决于从 url 传递的参数,例如。

【问题讨论】:

    标签: authentication spring-security customization


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-10-12
      • 2015-10-16
      • 2013-05-02
      • 2013-02-11
      • 2014-10-12
      • 2018-12-06
      • 2011-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多