java spring spring-security oauth-2.0

java - Spring Security OAuth2 servidor de recursos puros



spring-security oauth-2.0 (2)

Esto es posible siempre y cuando el servidor de autorización y el (los) servidor (es) de recursos accedan a un tokenStore compartido (p. Ej., Utilizando JdbcTokenStore con un dataSource común). Solo puede usar DefaultTokenServices con una referencia a su tokenStore compartido. A continuación se muestra un ejemplo de configuración de Spring que debería poder ajustar para satisfacer sus necesidades:

<?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>

Ya tenemos configurado un servidor de autorización OAuth2, así que necesito crear un servidor de recursos correspondiente (servidor separado). Planeamos utilizar el proyecto Spring Security OAuth2. Su documentación para configurar un servidor de recursos:

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

token-services-ref debería apuntar al bean de manejo de token. Sin embargo, parece que el manejo del token lo realiza el propio servidor a pesar de que es el servidor de recursos. No parece haber ninguna clase de servicios de token remotos o ninguna configuración relacionada con un servidor remoto. Esto contrasta con el CloudFoundary UAA ( https://github.com/cloudfoundry/uaa/blob/master/samples/api/src/main/webapp/WEB-INF/spring-servlet.xml ) que tiene:

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

¿Hay alguna forma de utilizar Spring Security OAuth2 para un servidor de recursos que se comunique con un servidor de Autorización OAuth2 independiente? ¿Cómo puedo configurar el punto final de comunicación?


Si es posible. Como ya ha mencionado en su pregunta, RemoteTokenServices es la solución.

He creado una muestra que tiene servidores separados de autenticación y recursos. Es solo una muestra para dar una idea rápida sobre el concepto y abrir para la extensión.

Spring-AngularJS-OAuth2-Sample