分离资源服务器和授权服务器的正确方法是啥?

Posted

技术标签:

【中文标题】分离资源服务器和授权服务器的正确方法是啥?【英文标题】:What's the right way to separate the Resource Server and the Authorization Server?分离资源服务器和授权服务器的正确方法是什么? 【发布时间】:2013-05-12 20:57:23 【问题描述】:

使用 spring-security-oauth2 保护我的资源免受可以充当授权服务器的 SSO 端点的影响。当文档说明时我有点困惑:

OAuth 2.0 中的提供者角色实际上分为授权服务和资源服务,虽然它们有时驻留在同一个应用程序中,但使用 Spring Security OAuth,您可以选择将它们拆分为两个应用程序,也可以拥有多个资源共享授权服务的服务。

但我认为我没有找到这种情况的例子。在 sparklr/tonr 中,授权服务器和资源服务器位于同一个应用程序中。我在搜索中看到的唯一示例是this spring-servlet.xml,它需要ResourceServerTokenServices 的this 自定义实现才能工作。

如果可能的话,我想避免编写ResourceServerTokenServices 的自定义实现。是否有另一种方法可以在资源服务器中支持外部授权服务器?大致如下:

<bean class="com.example.ExternalAuthorizationServerTokenServices" 
    p:remote-url="https://my-oauth-compatible-sso.com" 
    p:token-endpoint="/oauth/access_token" 
    p:authorize-endpoint="/oauth/authorize" />

这可能吗?

*编辑:我将添加它作为一种解决方法(或者这可能是预期的解决方案)我正在使用 jdbc 令牌存储并依赖于两个服务器碰巧都可以访问该数据库的事实。

【问题讨论】:

结果如何?我开始面临同样的问题,任何建议将不胜感激。 结果正是我想要的。只要您为资源服务器和授权服务器指定一个指向相同DataSourceJdbcTokenStore,它似乎就可以正常工作。 我已经分离了认证服务器和资源服务器。测试用例虽然不完整。你可以在这里找到它github.com/nareshbafna/oauth2 我认为只有当您是通过 facebook 或 google 进行身份验证的用户时,您才应该定义另一个授权服务器 我也在寻找拆分授权服务器和资源服务器的正确方法,尽管文档并未涵盖有关它的所有内容。如果有人有任何示例或来源,将不胜感激。 【参考方案1】:

可以在spring-security.xml中分离开放资源和保护资源

模式 /api/** 将被保护,其他资源将被打开。

<!-- Protected resources -->
    <http pattern="/api/**" create-session="never" use-expressions="true"
        entry-point-ref="oauthAuthenticationEntryPoint"
        access-decision-manager-ref="accessDecisionManager"
        xmlns="http://www.springframework.org/schema/security">
        <anonymous enabled="false" />
        <intercept-url pattern="/api/**"
            access="hasAnyRole('ROLE_USER','ROLE_ADMIN')" />
        <custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
        <!-- <access-denied-handler ref="oauthAccessDeniedHandler"/> -->
        <access-denied-handler ref="oauthAccessDeniedHandler" />
    </http>

【讨论】:

【参考方案2】:

对于可能感兴趣的人,这里还有另一个用于分离身份验证服务器和资源服务器的示例:https://github.com/sharmaritesh/spring-angularjs-oauth2-sample

【讨论】:

以上是关于分离资源服务器和授权服务器的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

OAuth 2:分离资源服务器和授权服务器

Spring OAuth2 资源和授权服务器

IdentityServer4-前后端分离的授权验证

使用 JWT 身份验证与用户合作的正确方法是啥?

IdentityServer4-前后端分离的授权验证

springboot+spring security +oauth2.0 demo搭建(password模式)(认证授权端与资源服务端分离的形式)