【问题标题】:Odd object type change in Spring SecuritySpring Security 中的奇怪对象类型更改
【发布时间】:2011-01-28 10:08:14
【问题描述】:

谁能告诉我这是为什么

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

有时返回Object,有时返回String

我已经测试了用户是否登录

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

它打印的是真的。

【问题讨论】:

  • 什么对象?什么字符串?它是否因 ClassCastException 而失败?这正是返回。问题不清楚。
  • 对象。是的,它失败了。

标签: java spring spring-security


【解决方案1】:

getDetails() 中获得的对象确实是额外关于发生的身份验证信息的地方,这就是为什么它是一个Object 可能包含几乎任何东西的原因。尽管像 Stephen C 这样的人可能会讨厌它,但我认为它很棒,因为它允许您存储有关如何用户登录以及通常登录的信息。例如我们使用它来记录用户登录了我们的哪些子域,这对我们的应用程序来说是至关重要的信息。

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

这可能听起来令人困惑,但在 Spring Security 的基本使用中没有必要查看 getDetails()getDetails() 不会告诉您有关谁登录或允许他们做什么的任何信息,因此您可以放心地忽略它——除非您的应用程序(如我的应用程序)也需要知道如何作为登录。

【讨论】:

  • 我实际上需要getPrincipal,但这是相同的字符串问题。你能告诉我这是为什么吗?
【解决方案2】:

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

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

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

  • 用户是某物(例如, 生物特征,例如 指纹)。 [Authentication.getDetails()]

设计师在Authentication 界面中选择将所有三个(CredentialsPrincipalDetails)作为Object 是完全合理的。

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

【讨论】:

    【解决方案3】:

    Authentication.getDetails() 方法令人憎恶。 Authentication 接口表示它返回一个 Object 并且不同的实现返回差异很大的详细信息对象。

    他们为什么这样做?

    我的猜测是因为设计者认为它会过度限制人们支持特定站点实施细节的能力。或者他们只是推迟了正确的操作,然后发现为时已晚。

    最终结果是,如果您的网站使用多种身份验证/授权机制,那么提取和使用用户详细信息将是一件很麻烦的事情。

    【讨论】:

      【解决方案4】:

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

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

      至于getPrincipal()

      在使用用户名和密码的身份验证请求的情况下,这将是用户名。

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

      所以返回的内容是根据谁返回的!

      【讨论】:

        【解决方案5】:

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

        <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”将被授予权限。

        【讨论】:

          猜你喜欢
          • 2012-07-15
          • 2011-02-08
          • 2016-05-14
          • 1970-01-01
          • 2015-04-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多