客户端和资源服务器的 Spring OAuth2 XML 配置 [关闭]

Posted

技术标签:

【中文标题】客户端和资源服务器的 Spring OAuth2 XML 配置 [关闭]【英文标题】:Spring OAuth2 XML configuration for Client and Resource Server [closed] 【发布时间】:2018-06-23 12:28:46 【问题描述】:

任何人都可以帮助我在 XML 中进行非常基本的配置,以将我的 Spring 应用程序作为 OAuth2/OIDC 资源服务器和客户端。

我有什么?

具有 Spring Secuirity LDAP 身份验证的 Spring Web MVC 应用程序。

我想达到什么目标?

    如果用户尝试访问我的应用程序中的任何资源(例如 index.html),则应要求他提供凭据(可以是弹出窗口或重定向到登录页面)。 应用程序应连接第三方授权服务器并获取 OAuth2 访问令牌和刷新令牌。 收到访问令牌后,应用程序应创建会话并提供第一步中要求的所需资源。 当用户点击注销或会话过期时,流程从第一步开始。

到目前为止我尝试了什么?

我已经在 Spring boot 和 OIDC 中尝试过这个。但我正在寻找一些很好的参考来实现上述XML 配置。请注意,我不能使用 Spring Boot 或任何 java 配置。

关于如何开始这一切有什么想法或建议吗?

谢谢。

【问题讨论】:

您提到您希望应用程序成为 oauth-resource-server 以及客户端应用程序?你确定吗?这没有任何意义。 我希望我的后端由 Oauth2 保护,所以我提到了资源服务器。我还在我的应用程序中托管了一个 Angular 应用程序,它应该从第三方身份提供者那里获取 Oauth 令牌,所以我提到了客户端。这有意义吗? 这实际上是一个很好的问题,因为 Spring Security 转换了他们的 Oauth 支持,有些部分没有完全实现。特别是,XML 配置不会很快实现。同时,我们使用以前版本的安全性和 5.0.x 核心。并依赖参考实现github.com/mitreid-connect/OpenID-Connect-Java-Spring-Server 【参考方案1】:

首先,我必须说你可以在Spring's oAuth Samples 部分找到很好的例子。

不管怎样,我在前一段时间玩它时创建了一个oAuth-sample-project (GitHub),所以这里是有趣的部分。考虑到您必须从文档中学习一些知识,并深入研究代码......但我认为这对于一个起点来说是好的。

客户端 XML:

<sec:http authentication-manager-ref="authenticationManager">
    <sec:intercept-url pattern="/secure/**" access="ROLE_USER" />
    <sec:anonymous/>

    <!-- sec:form-login/-->

    <sec:form-login 
        login-page="/login/login.htm" 
        authentication-failure-url="/login/login.htm?login_error=1" />


    <sec:custom-filter ref="oauth2ClientFilter" after="EXCEPTION_TRANSLATION_FILTER" />
</sec:http>


<sec:authentication-manager alias="authenticationManager">
    <sec:authentication-provider user-service-ref="userDetailsService"/>
</sec:authentication-manager>

<sec:user-service id="userDetailsService">
    <sec:user name="admin"  password="admin"  authorities="ROLE_USER,ROLE_ADMIN" />
</sec:user-service>



<!--apply the oauth client context-->
<oauth:client   id="oauth2ClientFilter" />


<oauth:resource id="butkecResource"
                type="authorization_code"
                client-id="$oauth2.client.id"
                client-secret="$oauth2.client.secret"
                access-token-uri="$oauth2.client.accessTokenUri"
                user-authorization-uri="$oauth2.client.userAuthorizationUri"
                scope="read"/>

<!--define an oauth2 resource for facebook. according to the facebook docs, the 'client-id' is the App ID, and the 'client-secret' 
    is the App Secret -->
<oauth:resource id="facebook" 
    type="authorization_code" 
    client-id="233668646673605" 
    client-secret="33b17e044ee6a4fa383f46ec6e28ea1d"
    authentication-scheme="query" 
    access-token-uri="https://graph.facebook.com/oauth/access_token" 
    user-authorization-uri="https://www.facebook.com/dialog/oauth"
    token-name="oauth_token" 
    client-authentication-scheme="form" />

完整的 sn-p 是 here。

资源服务器 XML:

<security:http pattern="/index.html" security="none"/>
<security:http pattern="/browse" security="none"/>
<!-- security:http pattern="/welcome" security="none"/-->
<security:http pattern="/js/**" security="none"/>

<security:http  entry-point-ref="oauthAuthenticationEntryPoint"     
                access-decision-manager-ref="accessDecisionManager">
    <security:intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" />
    <security:custom-filter ref="resourceServerFilter" before="PRE_AUTH_FILTER" />
    <security:access-denied-handler ref="oauthAccessDeniedHandler" />
    <security:anonymous />
</security:http>
...
...
<oauth:resource-server id="resourceServerFilter" 
                    token-services-ref="tokenServices" />


<bean id="tokenServices" class="org.springframework.security.oauth2.provider.token.DefaultTokenServices" >
    <property name="tokenStore" ref="tokenStore" />
</bean>


<bean id="tokenStore" class="com.ohadr.oauth.resource_server.token.MyTokenStore" />


<bean id="oauthAuthenticationEntryPoint" class="org.springframework.security.oauth2.provider.error.OAuth2AuthenticationEntryPoint">
    <property name="realmName" value="butkec" />
</bean>

文件可以在here找到。

我认为这里不是解释每个位和字节的好地方,但同样 - 在 Spring docs 你可以找到很好的解释(我设法从那里学到了所有东西......)

【讨论】:

以上是关于客户端和资源服务器的 Spring OAuth2 XML 配置 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Spring安全中的Oauth2客户端

Spring boot Oauth2:使用 Feign、Ribbon、Zull 和 Eureka 从客户端到资源的令牌中继

Spring Security实现OAuth2.0——资源服务

使用OAuth2实现认证服务器和资源服务器

资源服务器上的 Spring Boot OAuth2 自定义角色

Java spring OAuth2客户端(资源服务器)总是返回'invalid token'错误