【问题标题】:Spring Security OAuth2 - Custom AuthenticationSpring Security OAuth2 - 自定义身份验证
【发布时间】:2015-04-27 15:39:23
【问题描述】:

我们需要向外部世界公开一个 REST 端点,以便由我们无法控制的外部服务调用。负责这个外部服务的人似乎是安全专家(不是),因此他们至少不使用 HTTP Basic Auth 或任何其他真正的身份验证机制,而是使用固定的秘密来验证自己。它是这样的:

GET /endpoint?secret=WE_ARE_THE_TRUE_GUYS

由于我们已经在使用 spring-security-oauth2,因此我们希望将此身份验证流程与我们现有的流程集成,以便我们可以为该端点指定规则,就像我们为 ResourceServer 上的每个其他端点所做的一样,获得相同的错误处理行为等。我们应该如何实现自定义身份验证过滤器 - 或任何可能的 - 将从查询字符串中获取 secret 参数,将其转换为某种“客户端凭据” AuthorizationServer 上的预配置客户端并与 OAuth2 流程的其余部分无缝集成?

【问题讨论】:

    标签: spring-security spring-security-oauth2


    【解决方案1】:

    如果您可以将“WE_ARE_THE_TRUE_GUYS”转换为有效的OAuth2Authentication,那么您只需要一个身份验证过滤器即可(并将其粘贴在SecurityContext 中)。然后下游过滤器和处理程序的行为就像是真正的 OAuth2 身份验证一样。如果我是你,我会在该过滤器中设置一些非常严格的条件,以将请求与来自这个极不寻常且不太安全的身份验证通道的允许资源上的请求相匹配。

    【讨论】:

    • 谢谢戴夫。您对如何进行该转换有任何建议(我想将它们标识为 OAuth 客户端,因此无需用户身份验证)。我应该在 Spring Security 过滤器链的哪个位置放置这个过滤器?
    • 你可以从它的公共构造函数中创建一个OAuth2Authentication。那里没什么好看的。并且您的 Filter 需要位于资源服务器过滤器之前(通常位于 AbstractPreAuthenticatedProcessingFilter 之前 - 请参阅 org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigurer.configure(HttpSecurity))。
    • 考虑一种稍微不同的方法,我如何手动调用 TokenEndpoint 以便交换客户端 ID 和凭据以获取访问令牌(我的想法是将其粘贴到过滤器上的请求标头在其他一切之前执行)。
    • 不是你要手动调用的TokenGranter吗?您可以使用ClientCredentialsTokenGranter 交换客户端详细信息以获取令牌。
    猜你喜欢
    • 2014-04-20
    • 2014-12-13
    • 2016-08-05
    • 2020-12-05
    • 2018-02-09
    • 1970-01-01
    • 2014-01-12
    • 2016-09-05
    • 2021-04-21
    相关资源
    最近更新 更多