Spring security Spring安全OAuth2-自定义身份验证

Spring security Spring安全OAuth2-自定义身份验证,spring-security,spring-security-oauth2,Spring Security,Spring Security Oauth2,我们需要将REST端点公开给外部世界,以便由我们不控制的外部服务调用。负责此外部服务的人员似乎是安全专家(而不是),因此,他们至少不用HTTP基本身份验证或任何其他真正的身份验证机制,而是使用固定的秘密对自己进行身份验证。事情是这样的: GET /endpoint?secret=WE_ARE_THE_TRUE_GUYS 由于我们已经在使用spring-security-oauth2,我们希望将此身份验证流与现有流集成,以便我们可以像为资源服务器上的每个其他enpoint指定规则一样,为该端点指

我们需要将REST端点公开给外部世界,以便由我们不控制的外部服务调用。负责此外部服务的人员似乎是安全专家(而不是),因此,他们至少不用HTTP基本身份验证或任何其他真正的身份验证机制,而是使用固定的秘密对自己进行身份验证。事情是这样的:

GET /endpoint?secret=WE_ARE_THE_TRUE_GUYS

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

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

谢谢Dave。关于如何进行转换,您有什么建议吗(我想将它们标识为OAuth客户机,因此不需要用户身份验证)。在Spring安全过滤器链中,我将把这个过滤器放在哪里?您可以从它的公共构造函数创建一个
OAuth2Authentication
。没什么特别的。而您的
过滤器
需要在资源服务器过滤器之前(通常在
AbstractPreAuthenticatedProcessingFilter
之前-请参阅
org.springframework.security.oauth2.config.annotation.web.configurers.ResourceServerSecurityConfigure.configure(HttpSecurity)
)。考虑一种稍有不同的方法,我如何手动调用
TokenEndpoint
,以便为访问令牌交换客户端ID和凭据(我的想法是将其粘贴到过滤器上的请求头上,然后再执行其他操作)。这不是要手动调用的
TokenGranter
?您可以使用
ClientCredentialsTokenGranter
为令牌交换客户端详细信息。