por example basada autenticacion spring-mvc spring-security restful-authentication

spring mvc - example - Autenticación de token de seguridad de primavera-Servicio RESTful JSON



spring boot rest security jwt (3)

Estoy buscando usar Spring Security para una aplicación Spring MVC que será estrictamente un servicio web JSON. Investigué un poco y leí algunos artículos, pero no encontré nada completo. Quiero que la aplicación sea completamente sin estado y use autenticación basada en token. No quiero que la aplicación Spring MVC tenga formularios o formularios usados ​​para autenticarse. Debe tomar estrictamente las solicitudes y los datos en JSON, y devolver respuestas JSON.

Habrá una aplicación de cliente Angular JS que deberá enviar el nombre de usuario y la contraseña, y obtener el token de la aplicación para ser utilizado en solicitudes secuenciales. En algún momento, puede haber clientes de Android que también tengan acceso a este servicio web.

Supongo que Spring Security tiene su manera interna de asignar un token a una sesión de usuario, lo que significa que sabe que el token XXXXXXXXXXXX es el usuario administrador Bob y el token AAAAAAAAAA es el usuario estándar Joe. Sin embargo, no tengo mucha experiencia con Spring Security, así que no sé cómo se combina todo esto. Todavía quiero poder usar anotaciones seguras en los métodos de control y servicio.

¿Hay alguna manera de lograr esto en Spring Security?

Esta pregunta parece ser un buen lugar para comenzar, pero no estoy seguro de que funcione, ya que lo visualicé como una Autenticación RESTful a través de Spring .


"Quiero que la aplicación sea completamente sin estado"

Yo reconsideraría lo que estás tratando de hacer. Hay una razón por la cual no puede encontrar buenos ejemplos de su solución: simplemente no puede tener una aplicación apátrida y segura. Además, si guardas los tokens en algún lugar, no estarás apátrida. Incluso si no está almacenando los tokens (como el uso de JWT para codificarlos), debe protegerse contra los ataques CSRF si los usuarios tendrán acceso a esto en un navegador web. Si sigue su ruta, espere escribir un código de seguridad personalizado (lo cual es algo malo). Vea una discusión de esto aquí: https://spring.io/blog/2015/01/12/the-login-page-angular-js-and-spring-security-part-ii


En mi caso, me resultó más fácil reemplazar el org.springframework.security.web.context.SecurityContextRepository en org.springframework.security.web.context.SecurityContextPersistenceFilter con una implementación que comparta el SecurityContext entre varios nodos de tomcat. El cliente sigue enviando un token similar a jsessionid, pero puedo hacer un simple balanceo de carga round-robin y no tener que preocuparme por la replicación de la sesión.


Este será un buen lugar para comenzar con Spring-Rest-Boilerplate .

  1. Por primera vez, debe usar la autenticación HTTP básica y luego iniciar sesión (enviar nombre de usuario / contraseña) y esto devolverá el token.
  2. En la solicitud posterior, utilizará este token para la autenticación.
  3. Deberá agregar un filtro a la cadena que hará esa autenticación en función de un token.

Tienes que crear un formato de token y cifrado para el mismo. Lo ideal es que también tengas que caducar el token, la caducidad junto con el nombre de usuario podría ser una parte del token. Utiliza un algoritmo de encriptación, una función hash criptográfica como MD5 y obtén hash de todo el token.

Editar : como señaló Maciej Stępyra MD5 parece estar roto y se recomienda utilizar funciones de hash más fuertes como SHA-256.

La seguridad de Spring de forma predeterminada lo redireccionará a una página de inicio de sesión, pero esto no tiene sentido en caso de REST, por lo tanto, utilice un AuthenticationEntryPoint personalizado en config (ref ejemplo de código github).

Estaba usando este formato para mi Token: token:username:hash:expiry

hash = MD5 (nombre de usuario + clave mágica)

expiry = current_timestamp + mins_to_expiry

<security:http realm="Protected API" use-expressions="true" auto-config="false" create-session="always" entry-point-ref="**CustomAuthenticationEntryPoint**"> <security:custom-filter ref="**authenticationTokenProcessingFilter**" position="PRE_AUTH_FILTER" /> <security:intercept-url pattern="/**" access="isAuthenticated()" /> </security:http>

NB: Gracias dhavaln por el código. Lo he usado como referencia y he desarrollado algo similar.