gpt4 book ai didi

spring - 在多个应用程序上进行SSO和REST Api身份验证

转载 作者:行者123 更新时间:2023-12-04 03:57:59 26 4
gpt4 key购买 nike

在我们公司中,我们部署了多个Web应用程序,这些应用程序通过使用CAS服务器的SSO进行保护。
用户请求应用程序的URL,如果尚未通过身份验证,则将重定向到CAS服务器登录页面。如果验证成功,则用户将被重定向回原始请求的URL。通用的工作流程,效果很好

但是,我们也想使用CAS Server保护我们的REST Apis。
我们首选的流程如下:

  • 用户为应用程序REST Api创建 token
  • 使用此 token ,用户可以请求临时访问 token (如CAS token )
  • 在对REST Api的每个请求中
  • ,用户都将临时访问 token 作为HTTP header 或请求参数
  • 包括在内
  • REST Api应用程序针对CAS服务器检查提供的临时 token 的有效性

  • 听起来就像CAS服务器支持的OAuth,只是在任何时候都不会要求用户提供凭据,但是我们还想为服务(即其他调用我们的API的应用程序)提供身份验证:
  • 开发人员要求提供REST Api token (与CAS用户相关联)
  • 应用程序使用Api token
  • 请求临时访问 token
  • 对Api的进一步请求包括临时访问 token (作为HTTP header 或请求参数
  • )
  • REST Api应用程序针对CAS服务器检查临时访问 token 的有效性

  • 我们希望REST Api应用程序对用户凭据一无所知,它们甚至无法访问用户数据库,这对于使用该应用程序的用户来说很好用(重定向到CAS登录页面)。

    我不知道如何无需大量定制CAS服务器并自己实现此行为就可以实现此流程。

    Google将JWT用于 OAuth 2.0 for Server to Server Applications,这似乎是可行的方法。

    如果有人可以提供一些提示或替代方法(CAS服务器),我将不胜感激。也许有人已经使用CAS服务器实现了此模式,并且可以提供有关此问题的一些信息。

    此致,
    马可

    最佳答案

    最终,我们以一种简单的方式使其工作:

    在CAS服务器上:

  • 实现了一个REST端点,该端点允许客户端通过提供特定服务URL的clientId和clientSecret来获取CAS服务凭单ST。 clientId和clientSecret分别视为用户名和密码。

    REST端点
  • 创建一个新的自定义TokenBasedAuthenticationCredentials对象,并将其传递给CentralAuthenticationService以授予TGT和ST(为其授予ST的服务URL与clientId和clientSecret对相关联,并且可以从例如user获得) -database clientId | clientSecret | serviceUrl)。
  • 实现了一个新的AuthenticationHandler和CredentialsToPrcincipalResolver,它们仅支持TokenBasedAuthenticationCredentials。

  • REST端点/cas/../token返回一个JSON对象:
    { serviceTicket: 'ST-ALKSJDFLSJDFLKJ-Ljksdf-sdflkjsf' }

    在(基于Spring的)CAS客户端( protected 资源):
  • 已启用authenticateAllArtifacts

  • <bean id="serviceProperties" class="org.springframework.security.cas.ServiceProperties">
    <property name="service" value="${cas.service.url}" />
    <property name="sendRenew" value="false" />
    <property name="authenticateAllArtifacts" value="true"/>
    </bean>
  • 扩展CasAuthenticationFilter并重写getArtifact(request)以从HTTP Authorization-Header
  • 获取ST

    现在,想要访问您 protected 资源的客户端可以
  • 从CAS服务器
  • 获得ST
  • 在每个请求中向 protected 资源提供ST作为Authorization-Header

  • GET/rest/foo/bar HTTP/1.1
    主持人:www.example.com
    授权:CUSTOM_SCHEME ST-ALKSJDFLSJDFLKJ-Ljksdf-sdflkjsf

    由于CAS客户端CasAuthenticationFilter在每个请求上均获得工件(即ST),因此客户端仅在单个请求中就获得了身份验证。

    此外,在CAS服务器上,您可以将ST配置为仅对n个请求有效(CAS客户端在CAS服务器上请求serviceValidate url的次数)。

    我认为这是一种很好的方法,而不必大规模定制CAS服务器和客户端,随后又会造成严重的安全漏洞。

    关于spring - 在多个应用程序上进行SSO和REST Api身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25198234/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com