2016-09-28 82 views
0

我正在使用spring安全性来验证用户身份。该用户由第三方进行身份验证,并且在他到达我的应用程序时已经通过身份验证。 为了实现这个,我模拟了一个Authentication对象。春季安全 - 用户名和密码是否必须用于创建身份验证

我没有任何用户名和密码,而只是有标识符。我检查这个标识符是否有效使用我的自定义代码。

我的查询如下:

  1. 我是否需要用户名和密码来创建一个认证对象。 我没有提供用户名和密码,我的应用程序工作正常。

  2. 我只是想确保我正确使用spring-security。

  3. 在认证对象中没有设置用户名和密码的影响。我在下面的AbstractUserDetailsAuthenticationProvider中看到:

    //确保我们返回用户提供的原始凭证, //所以后续尝试即使使用编码密码也是成功的。

我也实现了一个自定义提供程序。

  1. 以上评论意味着什么?
  2. 我的方法正确吗?

回答

1

Spring Security中的Authentication接口表示对配置的安全规则和当前调用上下文进行验证的令牌。该界面有六种感兴趣的方法 - getPrincipal,getCredentials,getDetails,getAuthorities,isAuthenticatedsetAuthenticated

既然你验证你自己的用户,你应该主要关注在流动在合适的阶段调用setAuthenticated(true)使isAuthenticated开始使true以表示身份验证的用户。此外,您可以将GrantedAuthority添加到Authentication,以便任何基于角色的检查能够正常工作。

但是,确保getPrincipal(用于表单登录的用户名)为每个用户或每个会话返回一个唯一值将很有用。这将防止由于非唯一主体而导致用户会话互换的可能性,框架使用它来唯一标识用户。

您可以将getCredentialsgetDetails保持未实现。实际上,getCredentials(表单登录情况下的密码)应该在您的案例中保持未实现,因为您的应用程序没有用于实际验证用户的凭证;此外,在用户成功通过身份验证之后,保留身份验证是一种安全风险。

+0

嗨Manish,谢谢。我已经完成了上述工作,并且我的应用程序工作正常。我问道,因为我不是安全专家,所以想确认我的方法是否正确。上面的这段文字是否来自一些弹簧安全文档。 getPrinciple()也应返回用于身份验证的标识符。该标识符不是用户名,而是特定用户的唯一值。我没有使用表单登录在我的情况下,因为我最初列出的原因没有使用用户名/密码进行身份验证。 –

+0

细节来自我实现自定义'AuthenticationProvider's和'AuthenticationFilter's的体验。是的,您应该使用身份验证标识符作为委托人,只要每个用户或每个会话都是唯一的。这样你的认证令牌就不会搞砸了。请注意,如果您使用每会话标识符,并发会话控制和记住我等功能将无法即用即用,因为它们依赖于每个用户的唯一主体。 – manish

相关问题