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



使用spring-security-oauth2保护我的资源不受可以充当授权服务器的SSO端点的攻击。当文档声明:

时,我有点困惑:

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

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

如果可能的话,我想避免编写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令牌存储,并依赖于这两个服务器碰巧有访问该数据库的事实。

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

Pattern/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>

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

相关内容

最新更新