Java Spring Security中的奇数对象类型更改
有人能告诉我为什么会这样吗Java Spring Security中的奇数对象类型更改,java,spring,spring-security,Java,Spring,Spring Security,有人能告诉我为什么会这样吗 Details user=(Details) SecurityContextHolder.getContext().getAuthentication().getDetails(); 有时返回对象,有时返回字符串 我已经测试了用户是否使用登录 System.out.println(SecurityContextHolder.getContext().getAuthentication().isAuthenticated()); 它打印为true。身份验证.getD
Details user=(Details) SecurityContextHolder.getContext().getAuthentication().getDetails();
有时返回对象
,有时返回字符串
我已经测试了用户是否使用登录
System.out.println(SecurityContextHolder.getContext().getAuthentication().isAuthenticated());
它打印为true。身份验证.getDetails()方法令人讨厌。
Authentication
接口表示它返回一个对象
,不同的实现返回的详细信息对象差别很大
他们为什么这样做
我的猜测是因为设计者认为这会过度限制人们支持特定于站点的实现细节的能力。或者他们只是推迟了正确的操作,然后发现已经太晚了
最终的结果是,如果您的站点使用多个身份验证/授权机制,提取和使用用户详细信息是一件非常痛苦的事情。身份验证.getDetails()方法是一件令人厌恶的事情。
Authentication
接口表示它返回一个对象
,不同的实现返回的详细信息对象差别很大
他们为什么这样做
我的猜测是因为设计者认为这会过度限制人们支持特定于站点的实现细节的能力。或者他们只是推迟了正确的操作,然后发现已经太晚了
最终的结果是,如果您的站点使用多个身份验证/授权机制,提取和使用用户详细信息是一件非常麻烦的事。在
getDetails()
中获取的对象实际上是获取有关所发生身份验证的额外信息的地方,这就是为什么它是一个对象
,可能包含几乎任何内容。虽然像Stephen C这样的人可能不喜欢它,但我认为它非常棒,因为它允许您存储有关用户如何登录以及通常登录者的信息。例如,我们使用它记录用户登录的子域,这是应用程序的关键信息
我认为如果用户使用web表单登录,getDetails()
通常会返回一个WebAuthenticationDetails
对象。我记不清是什么原因导致它返回字符串,但我怀疑它是针对匿名用户的
这听起来可能令人困惑,但在Spring安全性的基本用法中,不需要查看
getDetails()
getDetails()
不会告诉您有关谁登录或允许他们做什么的任何信息,因此您可以安全地忽略它-除非您的应用程序(如我的应用程序)需要知道如何以及谁登录。在getDetails()中获得的对象
实际上是提供有关所进行身份验证的额外信息的地方,这就是为什么它是一个可能包含任何内容的对象。虽然像Stephen C这样的人可能不喜欢它,但我认为它非常棒,因为它允许您存储有关用户如何登录以及通常登录者的信息。例如,我们使用它记录用户登录的子域,这是应用程序的关键信息
我认为如果用户使用web表单登录,getDetails()
通常会返回一个WebAuthenticationDetails
对象。我记不清是什么原因导致它返回字符串,但我怀疑它是针对匿名用户的
这听起来可能令人困惑,但在Spring安全性的基本用法中,不需要查看getDetails()
getDetails()
不会告诉您关于谁登录或允许他们做什么的任何信息,因此您可以安全地忽略它-除非您的应用程序(如我的)需要知道如何以及谁登录。正如@gutch所说,从getDetails()的javadoc
存储有关身份验证请求的其他详细信息。这些可能是IP地址、证书序列号等
至于getPrincipal()
对于使用用户名和密码的身份验证请求,这将是用户名
AuthenticationManager
实现通常会返回一个包含
更丰富的信息作为应用程序使用的主体。许多身份验证提供者将创建一个UserDetails
对象作为主体
因此,返回的内容取决于谁返回它 正如@gutch所说,从getDetails()的javadoc
存储有关身份验证请求的其他详细信息。这些可能是IP地址、证书序列号等
至于getPrincipal()
对于使用用户名和密码的身份验证请求,这将是用户名
AuthenticationManager
实现通常会返回一个包含
更丰富的信息作为应用程序使用的主体。许多身份验证提供者将创建一个UserDetails
对象作为主体
因此,返回的内容取决于谁返回它 向匿名用户授予资源访问权限时,通常会返回字符串。您的配置应该是这样的
<security:intercept-url pattern="/login*" access="ROLE_ANONYMOUS" />
查看此处有关匿名身份验证的更多信息,
如果您使用的是自动配置,而不是配置匿名用户属性,则org.springframework.security.config.http.AuthenticationConfigBuilder会处理此问题。在这种情况下,匿名用户名将为“anonymousUser”,并且“ROLE\u anonymous”将被授予权限。向匿名用户授予资源访问权限时,通常会返回字符串。您的配置应该是这样的
<security:intercept-url pattern="/login*" access="ROLE_ANONYMOUS" />
查看此处有关匿名身份验证的更多信息,
如果您使用的是自动配置,而不是配置匿名用户属性,请访问org.springframework.security.config.http.AuthenticationConfig