Spring OAuth2 XML 客户端和资源服务器的配置

Spring OAuth2 XML configuration for Client and Resource Server

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

我有什么?

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

我想达到什么目的?

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

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

我已经用 Spring 启动和 OIDC 试过了。但我正在寻找一些很好的参考来实现上述 XML 配置 。请注意,我无法使用 Spring 引导或任何 java 配置。

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

谢谢。

首先,我必须说您可以在 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" />

完整代码段是 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 你可以找到很好的解释(我设法从那里学到了所有......)