secure - spring security oauth2 client registration
Usar ámbitos como roles en Spring Security OAuth2(proveedor) (1)
Consideremos una aplicación hipotética bastante simple donde los usuarios pueden leer o escribir publicaciones.
Algunos usuarios pueden leer y escribir artículos mientras que otros solo pueden leerlos. Con Spring Security (3.2.1) modelé esto teniendo 2 funciones:
- ROLE_WRITE: este rol otorga a los usuarios acceso a publicaciones escritas.
- ROLE_READ: este rol otorga a los usuarios acceso a publicaciones de lectura.
Implementar esto con la seguridad de Spring es bastante sencillo ...
Ahora también quiero permitir que las aplicaciones de terceros lean y escriban publicaciones en nombre de los usuarios implementando un proveedor OAuth2 utilizando Spring Security OAuth (versión 2.0.0.M3 ATM) .
Durante el paso de autorización, la aplicación pregunta al usuario si están dispuestos a otorgar el derecho de leer y / o escribir publicaciones en su nombre. El usuario aquí está otorgando ámbitos aquí (no roles).
Luego, cuando el consumidor de OAuth2 llama a mi API REST, Spring Sec OAuth autoriza el token otorgado y crea una autenticación que contiene al usuario con todas sus funciones y solo los ámbitos otorgados.
El problema (y la pregunta) es que ahora tengo que escribir una lógica de seguridad diferente dependiendo de si la API es llamada por un usuario normalmente autenticado (simplemente verifique los roles) o si se llama a través de OAuth2 (verificar roles + ámbitos).
¿Es posible "fusionar" los conceptos de roles y ámbitos en Spring Security OAuth2 para que, durante el paso de autorización, el usuario otorgue a la aplicación un subconjunto de los roles que tienen (y la autenticación OAuth2 solo los informe en las autoridades otorgadas) ? De esta forma, cuando la aplicación de terceros realiza una llamada a API, los roles en la autenticación son los que se otorgan. De esa forma no tengo que escribir ninguna lógica de seguridad específica de OAuth2.
Los ámbitos (y los roles) son cadenas arbitrarias, por lo que no hay problema si quiere hacer lo mismo. Para hacer que las declaraciones de las reglas de acceso sean idénticas, puede escribir un ExpressionHandler
que evalúe autoridades o ámbitos con los mismos valores, según el tipo de Authentication
que encuentre.
Un enfoque diferente se sugiere después de leer los comentarios: agregar un TokenStore
personalizado o ResourceServerTokenServices
. Estos son puntos de extensión de fácil acceso y permitirían modificar la OAuth2Authentication
para que sus autoridades otorgadas fueran las mismas que los ámbitos.
Mi preferencia, sin embargo, es controlar los ámbitos permitidos utilizando un OAuth2RequestFactory
, limitándolos en el punto de la concesión del token a valores que sean consistentes con las autoridades del usuario.