Spring Security中奇怪的对象类型更改

时间:2011-01-27 07:08:15

标签: java spring spring-security

有人可以告诉我为什么会这样吗

Details user=(Details) SecurityContextHolder.getContext().getAuthentication().getDetails();

有时会返回Object,有时会返回String

我已经测试过用户是否使用

登录
System.out.println(SecurityContextHolder.getContext().getAuthentication().isAuthenticated());

它打印为真。

5 个答案:

答案 0 :(得分:2)

getDetails()中获得的对象实际上是关于发生身份验证的额外信息的地方,这就是为什么它是Object可能包含任何内容的原因。虽然像Stephen C这样的人可能会讨厌它,但我认为这很棒,因为它允许您存储有关用户登录方式以及登录的信息。例如我们用它来记录用户登录的哪个子域,这是我们应用程序的关键信息。

如果用户使用网络表单登录,我认为getDetails()通常会返回WebAuthenticationDetails个对象。我不记得是什么原因导致它返回一个字符串,但我怀疑这是匿名用户。

这可能听起来很混乱,但是在Spring Security的基本使用中没有必要查看getDetails()getDetails()没有告诉您有关谁登录或允许他们做什么的任何信息,因此您可以安全地忽略它 - 除非您的应用程序(如我的)需要知道如何以及登录。

答案 1 :(得分:2)

现有的身份验证方法涉及三个基本“因素”:

  • 用户知道的东西(例如, 密码,PIN码; [Authentication.getCredentials()]

  • 用户拥有的东西(例如,ID,​​ATM 卡,智能卡); [Authentication.getPrincipal()]和

  • 用户的东西(例如, 生物特征,如a 指纹)。 [Authentication.getDetails()]

设计师选择在Credentials界面中将所有三个(PrincipalDetailsObject)设为Authentication,这是完全合理的。

在spring security中,AuthenticationProvider可以在成功验证中设置详细信息。默认AbstractUserDetailsAuthenticationProvider将身份验证请求中收到的详细信息复制到成功的身份验证。假设没有任何身份验证提供程序将String放入详细信息中,我们应该检查过滤器以查看是否在验证请求的详细信息中设置了任何字符串。

答案 2 :(得分:1)

Authentication.getDetails()方法令人厌恶。 Authentication接口表示它返回Object,不同的实现返回各种各样的细节对象。

为什么他们这样做?

我的猜测是因为设计师认为它会不适当地限制人们支持特定于站点的实现细节的能力。或者也许他们只是推迟了做到这一点,然后发现为时已晚。

最终结果是,如果您的站点使用多个身份验证/授权机制,那么提取和使用用户详细信息是一个正确的痛苦。

答案 3 :(得分:0)

正如@gutch所说,来自getDetails()

的javadoc

存储有关身份验证请求的其他详细信息。这些可能是IP地址,证书序列号等。

至于getPrincipal()

对于使用用户名和密码的身份验证请求,这将是用户名。

AuthenticationManager实施通常会返回包含Authentication的内容 更丰富的信息作为应用程序使用的主体。许多身份验证提供程序将创建一个UserDetails对象作为主体。

所以返回的内容取决于谁返回它!

答案 4 :(得分:0)

当您向匿名用户授予资源访问权限时,通常会返回字符串。你的配置看起来应该是这样的,

<security:intercept-url pattern="/login*" access="ROLE_ANONYMOUS" />

在此处查看有关匿名身份验证的更多信息, http://static.springsource.org/spring-security/site/docs/3.0.x/reference/anonymous.html

如果您使用自动配置而不是配置匿名用户属性,org.springframework.security.config.http.AuthenticationConfigBuilder会处理此问题。在这种情况下,匿名用户名将是'anonymousUser','ROLE_ANONYMOUS'将被授予权限。