【发布时间】:2013-05-03 07:06:18
【问题描述】:
我怎么知道getDetails()、getPrincipal() 等在SecurityContextHolder.getContext().getAuthentication() 上返回了什么?类型是对象,我无法理解文档中写的内容。
【问题讨论】:
标签: java spring jakarta-ee spring-security
我怎么知道getDetails()、getPrincipal() 等在SecurityContextHolder.getContext().getAuthentication() 上返回了什么?类型是对象,我无法理解文档中写的内容。
【问题讨论】:
标签: java spring jakarta-ee spring-security
getDetails() 返回一个 WebAuthenticationDetails 对象,该对象包含用户的 IP 地址和 SessionId(尽管我怀疑这可能取决于应用程序的类型;由于 getPrincipal() 具有类似的依赖性,因此getDetails() 也可能会有所不同。以类似的方式)。
getPrincipal() 返回一个对象,该对象取决于您管理身份验证的方式。例如,对于 LDAP 身份验证,getPrincipal() 方法返回一个 LdapUserDetailsImpl 对象。
如果您需要访问用户/主体信息,我会设置一个自定义 UserDetails 类,并从那里存储/检索所需的信息,但您可以轻松使用 getPrincipal() 和 getDetails()将它们作为符合条件的类,或者您扩展它们自然返回的类(并随心所欲地管理它们)。
这有点有趣,我觉得有必要注意,getPrincipal() 方法实际上并没有返回一个 Principal 对象(LdapUserDetailsImpl 对象也不能被转换为一个 Principal 对象)。
【讨论】:
这个怎么样? (假设getPrincipal() 不返回null)
String className = SecurityContextHolder.getContext().getAuthentication().getPrincipal().getClass().getName();
它应该返回带有包名的类名,即完全限定的类名。我认为该类型将是实现java.security.Principal 的东西(一些特定于弹簧的类)。因此,您可以执行以下操作:
Principal p = (Principal) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
【讨论】: