web-dev-qa-db-fra.com

Serveur de ressources pure Spring Security OAuth2

Nous avons déjà un serveur d'autorisation OAuth2 configuré, j'ai donc besoin de créer un serveur de ressources correspondant (serveur séparé). Nous prévoyons d'utiliser le projet Spring Security OAuth2. Leur documentation pour configurer un serveur de ressources:

https://github.com/spring-projects/spring-security-oauth/wiki/oAuth2#resource-server-configuration

token-services-ref devrait pointer vers le bean de gestion des jetons. Cependant, il semble que la gestion des jetons soit effectuée par le serveur lui-même, même s'il s'agit du serveur de ressources. Il ne semble pas y avoir de classe de services de jetons distants ou de configuration relative à un serveur distant. Ceci est en contraste avec l'UAA CloudFoundary ( https://github.com/cloudfoundry/uaa/blob/master/samples/api/src/main/webapp/WEB-INF/spring-servlet.xml =) qui a:

<bean id="tokenServices"
  class="org.cloudfoundry.identity.uaa.oauth.RemoteTokenServices">
  <property name="checkTokenEndpointUrl" value="${checkTokenEndpointUrl}" />

Existe-t-il un moyen d'utiliser Spring Security OAuth2 pour un serveur de ressources qui communique avec un serveur d'autorisation OAuth2 distinct? Comment puis-je définir le point de terminaison de communication?

19
Explosion Pills

Cela est possible tant que le serveur d'autorisation et le ou les serveurs de ressources accèdent à un tokenStore partagé (par exemple en utilisant JdbcTokenStore avec un dataSource commun). Vous pouvez simplement utiliser DefaultTokenServices avec une référence à votre tokenStore partagé. Vous trouverez ci-dessous un exemple de configuration Spring que vous devriez pouvoir modifier en fonction de vos besoins:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xmlns:security="http://www.springframework.org/schema/security"
   xmlns:oauth2="http://www.springframework.org/schema/security/oauth2"
   xsi:schemaLocation="
    http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-3.1.xsd
    http://www.springframework.org/schema/security/oauth2
    http://www.springframework.org/schema/security/spring-security-oauth2.xsd">

<bean id="tokenStore" class="org.springframework.security.oauth2.provider.token.JdbcTokenStore">
    <constructor-arg name="dataSource" ref="dataSource" />
</bean>

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

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

<bean id="oauthAccessDeniedHandler" class="org.springframework.security.oauth2.provider.error.OAuth2AccessDeniedHandler" />

<bean id="accessDecisionManager" class="org.springframework.security.access.vote.UnanimousBased">
    <constructor-arg>
        <list>
            <bean class="org.springframework.security.oauth2.provider.vote.ScopeVoter" />
            <bean class="org.springframework.security.access.vote.RoleVoter" />
            <bean class="org.springframework.security.access.vote.AuthenticatedVoter" />
        </list>
    </constructor-arg>
</bean>

<!-- This is not actually used, but it's required by Spring Security -->
<security:authentication-manager alias="authenticationManager" />

<oauth2:expression-handler id="oauthExpressionHandler" />

<oauth2:web-expression-handler id="oauthWebExpressionHandler" />

<security:global-method-security pre-post-annotations="enabled" proxy-target-class="true">
    <security:expression-handler ref="oauthExpressionHandler" />
</security:global-method-security>

<oauth2:resource-server id="myResource" resource-id="myResourceId" token-services-ref="tokenServices" />

<security:http pattern="/myPattern/**" create-session="never"
    entry-point-ref="authenticationEntryPoint" access-decision-manager-ref="accessDecisionManager">
    <security:anonymous enabled="false" />
    <security:intercept-url pattern="/**" access="SCOPE_READ" method="GET" />
    <security:intercept-url pattern="/**" access="SCOPE_READ" method="HEAD" />
    <security:intercept-url pattern="/**" access="SCOPE_READ" method="OPTIONS" />
    <security:intercept-url pattern="/**" access="SCOPE_WRITE" method="PUT" />
    <security:intercept-url pattern="/**" access="SCOPE_WRITE" method="POST" />
    <security:intercept-url pattern="/**" access="SCOPE_WRITE" method="DELETE" />
    <security:custom-filter ref="myResource" before="PRE_AUTH_FILTER" />
    <security:access-denied-handler ref="oauthAccessDeniedHandler" />
    <security:expression-handler ref="oauthWebExpressionHandler" />
</security:http>
</beans>
18
Chris H.

Oui c'est possible. Comme vous l'avez déjà mentionné dans votre question, RemoteTokenServices est la solution.

J'ai créé un échantillon qui a un serveur d'authentification et de ressources séparé. C'est juste un échantillon pour donner une idée rapide du concept et ouvert à l'extension.

Spring-AngularJS-OAuth2-Sample

9
Rites