Implementar seguridad en java

 seguridad con spring security, tipo de implemntacion

seguridad basica

seguridad jwtoken

seguridad oauth 2.0


Autentificación:

a través de interfaz AutehenticationManager, que implementa patrón estrategia, este puede hacer trsz cosas:

todas las clases que implementan esta interfaz, son formas de autentificar al usuario, la mas utilizada es la que devuelve una cadena de providerManager,

  • devolver un Autehentication
  • lanzar una excepcion
  • devolver null


 Autorización

Una vez realizada la autentificación de forma exitosa, se realiza el control de acceso a traves de la interfaz accessDesicionManager , para configurarlos podemos:

  • extendiendo la clase webSecurityConfigureAdapter y el uso de antMatchers (patrones de rutas)
  • a través de anotaciones @preAuthorize y @PostAuthorize

esta interfaz tiene tres implementaciones, y todas delegan en una cadena de accessDecisionVoter, similar al providerManager

un accessDecisionVoter considera un Authentication y un objeto seguro, el objeto seguro puede representar una web y es decorado con una colección de ConfigAttributes

los ConfigAttributes decoran un objeto con metadatos para eterminar el nivel de permisos, por ejemplo Role_admin o role_audit


interfaces utilizadas mas utilizadas de spring security


webSecurityConfigurerAdapter

*Se extiende en nuestra clase de seguridad

  • clase base para configuracion web
  • suele venir con @Configuration + @EnableWebSecurity
  • Métodos configurar autentificación y autorización



Authentication

  • interfaz que extiende de principal
  • representa un token para realizar la authenticacion
  • normalmente se almacena en el contexto de seguridad (SecurityContext) manejado por el SecurityContextHolder
  • Spring Security tiene decenas de clases que lo implementan, por ejemplo UsernamePasswordAuthentificationToken
  • Interfaz Nuclear de la autentificación




AuthenticationManagerBuilder

  • Builder para construir un authentificationManager, a travez de:
    •  LDAP,
    • JDBC
    •  UserDetailService.
  • Se suele configurar sobrescribiendo el método configure, de la clase WebSecurityConfigurerAdapter



UserDetails
  • interfaz que representa la informacion nuclear de un usuario
  • Almacena información que será encapsulada en un objeto de tipo Authentication

User
información de un usuario obtenido por UserDetailsService
la podemos usar directamente, extenderla o implementar la interfaz UserDetails



GrantedAuthority

  • representa un privilegio individual
  • se puede usar con perspectiva de grano fino, CAN_READ_SOME_ENTITY_PROPERTY
  • también puede representar un Rol con prefijo ROLE_
  • la clase que la implementa es SimpleGrantedAuthority

UserDetailsService

  1. Interfaz para cargar la informacion del usuario
  2. Se utiliza como DAO
  3. Es utilizado por DaoAuthenticationProvider, para obtener los datos del usuario
  4. Un solo metodo, userDetails LoadUserByUsername(String)
  5. Se suele utilizar cuando almacenamos la información de los usuarios a través de Spring data y el uso de entidades


JWT:
  • no es un standar de autenticación, es un standar para la creación de tokens de acceso que permite propagar la identidad y privilegios
  • no obliga que el servidor maneje la sesión
  • son confiables, o sea que no haya sido mutado...esta firmado digitalmente


Autenticación OAuth 2.0
  • Standar abierto para la autentificación de Apis
  • permite compartir información entre sitios sin compartir la identidad
  • implementa diferentes flujos de autenticación: authorization code flow, resource owner password credential flow, implicit flow.....

para una única clase de dominio, tendremos varias clases para representarla, por ejemplo el caso de los usuarios, tendríamos:
  • UserEntity
  • User 
  • CreateUserDTO
  • GetUserDTO


implementación en código

1-en src\main\java\com\openwebinars\rest\users\model\UserRole.java
creamos enumeracion con los roles definidos para la aplicacion

2-Creamos la clase src\main\java\com\openwebinars\rest\users\model\UserEntity.java
Esta clase implementara la interfaz UserDetails
Esto nos definirá varios métodos, por ejemplo el GranteAuthority, este método retorna los roles del usuario...los otros métodos a implementar nos sirven para hacer validaciones, como si el tiempo sin modificar la contraseña o la cuenta esta bloqueada porque la cuenta lleva mas de un año inactiva.

esta clase tiene los campos id (autogenerado) y los campos típicos de una clase que representa una tabla.


3-habilitar la auditoria con @EnableJpaAuditing en Application del método main, 

4- Agregamos Base de datos, creamos el package ...\users\repos y dentro el archivo src\main\java\com\openwebinars\rest\users\repos\UserEntityRepository.java, este extiende de JpaRepository, no es necesario que este anotado con @Repository .
Creamos los metodos tipicos para obtener los datos del usuario, por ejemplo findById,findAll,etc...

5- También creamos la clase service que se encarga de envolver los datos del repositorio, de esta forma service llama al repository y controll a service, y no se llama directamente repository desde controller.
para esto creamos el package users/service y dentro el archivo src\main\java\com\openwebinars\rest\users\services\UserEntityService.java  decorado con @Service y extendera de la interfaz de BaseService<UserEntity, long, UserEntityRepository>
 y creamos los métodos que acceden al repository (lo tipico).... y logica como habilitar usuario, comprobar el tiempo de inactividad para solicitar cambio de contraseña, etc....

  1. instanciamos a passwordEncoder 
  2. creamos método nuevoUsuario, quien utiliza passworEncoder para cifrar el password del nuevo usuario (método de entrada del tipo userEntity)

6- implementamos interfaz  UserDetailsService que carga la información de un usuario, no realiza la validación, sino que es una herramienta para obtener los datos del usuario.
en el package users/services creamos la clase src\main\java\com\openwebinars\rest\users\services\CustomUserDetailsService.java esta clase con decorador @Service implementa la interfaz UserDetailService esta nos obliga a implementar el método loadUserByUsername

7- Creamos el package rest/Security y creamos la class src\main\java\com\openwebinars\rest\security\SecurityConfig.java que extiende de WebSecurityConfigureAdapter y sobrescribe el método  configure()
Tambien creamos un @Bean con el método passwordEncoder el cual devuelve un objeto PasswordEncoder


8- Creamos el package users/controllers para crear nuestra ruta que recibe los datos del usuario y ejecuta el metodo nuuserEntityServiceevoUsuario(newUser)



implementando seguridad basica

@AuthenticationPrincipal userEntity= se recibe como parametro en metodo controller

Implementar seguridad JWT
spring security no proporciona todo lo necesario, por ello debemos implementar JWT

JWTAuthenticationEntryPoint

jwtProvider y jwtBuilder --Reemplaza a uno deprecado:
Genera Token 


Authentification OAuth2.0
  • Estandar abierto para autentificar apis, loguearse con un tercero sin dar a conocer nuestra identidad
  • distintas formas de loguearse
  • Paliar la necesidad del envio continuo de credenciales entre cliente y servidor
  • al usuario delega la capacidad de hacer ciertas acciones en su nombre
  • al desarrollar una aplicacion no tenemos la necesidad de almacenas username/password
  • esta mas orientado al control de acceso (autorizacion)
  • Video grant Types
  • cuatro roles definidos:
    • dueño del recurso
    • client
    • servidor de recursos protegido
    • servidor de autorizacion
  • tipos de clientes: dependiendo del tipo de cliente se implementa el flujo de OAuth2, distintas formas de obtener el token-Grant Types
    • confidenciales: backend (pueden guardar contraseña)
    • publicas:  fronend (no pueden guardar contraseña)

Comentarios

Entradas populares de este blog

¿Como llamar una función del componente padre desde un componente hijo, en angular 8?

Frontend: Suscripciones y Observables con Angular 8

Enrutado con lazy loading en angular 8