Control de Acceso Basado en Roles(RBAC) en Angular, usando Guardas y Directivas Estructurales.

แชร์
ฝัง
  • เผยแพร่เมื่อ 15 ต.ค. 2024

ความคิดเห็น • 105

  • @titusfx
    @titusfx ปีที่แล้ว +6

    7:07 canLoad esta deprecated sugieren canMatch. Gracias por el video :)

    • @akotech
      @akotech  ปีที่แล้ว +2

      Correcto! 👍
      A partir de la v.15 canLoad fue marcada como _deprecated_ en favor de canMatch.

    • @luisalfredoricopabardales6345
      @luisalfredoricopabardales6345 10 หลายเดือนก่อน

      @@akotech tendras algùn video actualizado con canMatch?

    • @akotech
      @akotech  10 หลายเดือนก่อน +2

      @@luisalfredoricopabardales6345 Por poder, lo podría hacer algún día. Pero la única diferencia en el funcionamiento de canMatch con respecto al resto de guardas, es que devolviendo false desde canMatch, en vez de detener la navegación, lo que hace es que se ignore esa ruta y pase a la siguiente. Lo que te permitiría por ejemplo tener más de una ruta con un mismo path.
      un saludo y gracias por tu comentario 😉

  • @WildeerAlexanderRumbosContrera
    @WildeerAlexanderRumbosContrera ปีที่แล้ว +3

    que calidad de video y de explicacion estimado me quito el sombrero es usted un crack

    • @akotech
      @akotech  ปีที่แล้ว +1

      Muchas gracias 😊!
      un saludo

  • @hacsor22
    @hacsor22 2 ปีที่แล้ว +12

    Muchas gracias, es difícil encontrar contenido de calidad en Angular en español, he aprendido mucho. De nuevo gracias y quedo pendiente a más videos

    • @akotech
      @akotech  2 ปีที่แล้ว +1

      Gracias 😊!

  • @andresfelipecano4160
    @andresfelipecano4160 ปีที่แล้ว +1

    esta brutal el contenido de esta video y del canal

    • @akotech
      @akotech  ปีที่แล้ว +1

      Muchas gracias por tus palabras Andres.
      Un saludo

  • @ICrazyDemonI
    @ICrazyDemonI ปีที่แล้ว +1

    Soy nuevo en Angular y no entiendo muchas cosas, pero esto si lo entendí. Muy buena explicación. Desde el método básico al avanzado.

    • @akotech
      @akotech  ปีที่แล้ว

      Muchas gracias. Un placer haberte podido ayudar. 😉
      un saludo

  • @stevknot1
    @stevknot1 11 หลายเดือนก่อน

    ufffffffffffffff excelente, muchas gracias, la manera en que explican es increíble, enserio muchas gracias, la manera en que se comprende la información, de la forma que la explican ufff, contenido de calidad dijeron por ahí en otro comentario. Muchas Gracias.

    • @akotech
      @akotech  11 หลายเดือนก่อน

      gracias a ti por tus palabras 😉

  • @martingonzales2665
    @martingonzales2665 5 หลายเดือนก่อน

    Increíble, eres el mejor explicando a detalle y de forma sencilla. Muchas gracias!!!

    • @akotech
      @akotech  5 หลายเดือนก่อน

      gracias a ti por tus palabras!
      un saludo 😉

  • @mpalaciost
    @mpalaciost 2 ปีที่แล้ว

    Genial!!!!, muy bien explicado. Graciassssss por compartir el conocimiento, son unos capos!!!. Saludos desde Perú

    • @akotech
      @akotech  2 ปีที่แล้ว

      Gracias a ti por tu comentario y un saludo!

  • @heberduarte3233
    @heberduarte3233 ปีที่แล้ว

    Es increíble lo didáctico del contenido, muy bueno en visualización y lo práctico de sus ejemplos!!

    • @akotech
      @akotech  ปีที่แล้ว

      Muchísimas gracias! 😊

  • @MiguelChinchay
    @MiguelChinchay ปีที่แล้ว

    Excelente tutorial para los roles y permisos. Muchas gracias por el aporte

    • @akotech
      @akotech  ปีที่แล้ว

      Gracias a ti por tus palabras!
      un saludo

  • @ferlezcano
    @ferlezcano ปีที่แล้ว

    Tome su subscripción caballero!
    Buenísimo video! 💪

    • @akotech
      @akotech  ปีที่แล้ว

      Gracias y bienvenido! 😊
      un saludo

  • @YurlyAndresVelezBedoya
    @YurlyAndresVelezBedoya ปีที่แล้ว

    Muchas gracias, un vídeo muy claro, conciso y útil!!! Felicidades

    • @akotech
      @akotech  ปีที่แล้ว

      gracias! 😊

  • @jvp2007d
    @jvp2007d ปีที่แล้ว

    Gran vídeo de gran calidad y que va al punto a tratar, gracias por el aporte.

    • @akotech
      @akotech  ปีที่แล้ว

      Gracias por tus palabras Jorge!
      un saludo

  • @oscarperez-kp3qd
    @oscarperez-kp3qd 2 ปีที่แล้ว

    Excelente contenido: al grano y muy práctico!

    • @akotech
      @akotech  2 ปีที่แล้ว

      gracias 😊!

  • @andresmauriciofajardoolaya2721
    @andresmauriciofajardoolaya2721 ปีที่แล้ว

    nuevo sub, que manera tan clara de explicar algo que podría considerarse complejo

    • @akotech
      @akotech  ปีที่แล้ว

      Gracias y bienvenido Andrés.
      un saludo 😉

  • @MarceloSantinelli-xo9oe
    @MarceloSantinelli-xo9oe 5 หลายเดือนก่อน

    Excelente resumen. Claro y rápido. ¡Muchas gracias!

  • @eivanmtzleal9547
    @eivanmtzleal9547 ปีที่แล้ว

    uffff... Gracias! Excelente contenido... Sos un Crack... Saludos y subscrito...

    • @akotech
      @akotech  ปีที่แล้ว +1

      Muchas gracias y bienvenido 😉!

  • @rodrigoalave9323
    @rodrigoalave9323 8 หลายเดือนก่อน

    Excepcional, felicitaciones hiciste un buen trabajo. Muchas gracias.

    • @akotech
      @akotech  8 หลายเดือนก่อน

      Mucha gracias por tus palabras 😊.
      un saludo

  • @antonyjuniorperezperez116
    @antonyjuniorperezperez116 11 หลายเดือนก่อน

    Gracias, que contenido tan didactico.

    • @akotech
      @akotech  11 หลายเดือนก่อน

      Gracias a ti por tus palabras Antony.
      un saludo 😉

  • @martinflores9611
    @martinflores9611 ปีที่แล้ว

    uy muy buen tutorial me acabo de encontrar tu canal

    • @akotech
      @akotech  ปีที่แล้ว +1

      Gracias 😊!

  • @AndresVillanuevand
    @AndresVillanuevand 2 ปีที่แล้ว

    Increíblemente claro! Muy buen material. Felicidades

    • @akotech
      @akotech  2 ปีที่แล้ว

      Muchas gracias 😁!

  • @useradm-z1g
    @useradm-z1g ปีที่แล้ว

    Excelente explicación !muchas gracias !

    • @akotech
      @akotech  ปีที่แล้ว

      Gracias a ti por tus palabras!
      un saludo 😉

  • @ebarchiesi
    @ebarchiesi 4 หลายเดือนก่อน

    Muy buen video gracias por compartir

    • @akotech
      @akotech  4 หลายเดือนก่อน

      Muchas gracias a ti por tu comentario.
      un saludo 😉

  • @flaviocortes1922
    @flaviocortes1922 4 หลายเดือนก่อน

    excelente explicacion, son unos crack. gracias

    • @akotech
      @akotech  4 หลายเดือนก่อน

      Muchas gracias Flavio 😊
      un saludo

  • @Adoracion-Alabanza
    @Adoracion-Alabanza 2 ปีที่แล้ว

    Muchísimas gracias, mi pedido de hace unos meses!!! Muy bien explicado 👍

    • @akotech
      @akotech  2 ปีที่แล้ว +1

      He tardado un poco más de lo que esperaba en un inicio, pero me alegro que sigas por aquí y que te haya útil.
      un saludo 😉

  • @felixurbano1199
    @felixurbano1199 ปีที่แล้ว

    Excelente contenidoo! Muy claro y conciso. Gracias por tu tiempo, trabajo y esfuerzo, de lo mejor que he encontrado en youtube !! nuevamente mil gracias! Quedo atento a más contenido !! Saludos !

    • @akotech
      @akotech  ปีที่แล้ว

      Muchísimas gracias por tus palabras Felix!
      un saludo

  • @SergioUkrAr
    @SergioUkrAr 2 ปีที่แล้ว

    Super ejemplo, muchas gracias!.

    • @akotech
      @akotech  2 ปีที่แล้ว

      gracias a ti por tu comentario 😉!

  • @alejandrograficos
    @alejandrograficos ปีที่แล้ว

    Qué pedazo de contenido! Cada uno de tus videos es oro puro. Muchas gracias por compartir tanto conocimiento y de forma tan clara, crack!

    • @akotech
      @akotech  ปีที่แล้ว

      Muchísimas gracias a ti por tus palabras!
      un saludo

  • @jpduranhe
    @jpduranhe 2 ปีที่แล้ว

    Excelente material, gracias !!!

    • @akotech
      @akotech  2 ปีที่แล้ว

      Gracias a ti por tu comentario! 😊

  • @franzmamani7247
    @franzmamani7247 ปีที่แล้ว

    nuevo seguidor!!... un video de calidad gracias!!!....

    • @akotech
      @akotech  ปีที่แล้ว

      Muchas gracias y bienvenido! 😊

  • @Pharaoh29_
    @Pharaoh29_ 8 หลายเดือนก่อน

    Que buena explicación.

    • @akotech
      @akotech  8 หลายเดือนก่อน +1

      Muchas gracias. un saludo 😉

  • @majinkiko2358
    @majinkiko2358 ปีที่แล้ว

    Tremendos videos, descubri tu canal hoy mismo y tenes las respuesta a muchas preguntas que me he hecho. Sin duda me ayudarán a llevar mi nivel de angular a otro nivel. Me gustaria ver un video haciendo un proyecto para ver cómo los piensas y como encara un proyecto entero alguien con tu expertise. Muchas gracias :D

    • @akotech
      @akotech  ปีที่แล้ว

      Muchas gracias por tus palabras.
      Me apunto lo de crear un video sobre un proyecto completo para el futuro. Tienes alguna preferencia en cuanto al tipo de app que te gustaría ver?
      un saludo

  • @crazymacer
    @crazymacer ปีที่แล้ว

    Muchas gracias por el video, super entendible todo, solo tengo una duda, veo que la lógica de validación de los roles en la directiva lo haces en el pipe TAP, hay alguna diferencia de realizar la validación en el subscribe?, gracias de antemano

    • @akotech
      @akotech  ปีที่แล้ว +1

      Hola Mario, la validación la hago en el map. En el tap simplemente renderizo o elimino el template de la app en función del resultado de la validación. Y sí, en este caso es indistinto definir esta lógica de renderizado en el tap o en el subscribe.
      un saludo y gracias por tu comentario

  • @Teckmoh
    @Teckmoh 3 หลายเดือนก่อน

    Muy buen video

    • @akotech
      @akotech  3 หลายเดือนก่อน

      Muchas gracias Diego. 😉
      un saludo

  • @nelsondamianbrizuela7472
    @nelsondamianbrizuela7472 ปีที่แล้ว

    Excelente explicación

    • @akotech
      @akotech  ปีที่แล้ว

      Muchas gracias Nelson!
      un saludo

  • @maximrunix
    @maximrunix 11 หลายเดือนก่อน

    TODO UN CAPO,. GRACIAS

  • @andresfcuellarc
    @andresfcuellarc 2 หลายเดือนก่อน

    Genial!

  • @pw4645
    @pw4645 ปีที่แล้ว

    Que buen video muchas gracias. podrias hacer uno con Interceptores con renovacion del token ? 👏👏👍

    • @akotech
      @akotech  ปีที่แล้ว

      Muchas gracias por tu comentario . Me apunto lo del interceptor.
      un saludo

  • @andresmauriciorubiano
    @andresmauriciorubiano 3 หลายเดือนก่อน

    ¡Gracias!

    • @akotech
      @akotech  3 หลายเดือนก่อน

      Muchas gracias a ti por tu apoyo Andrés! 😊
      un saludo

  • @urtaav639
    @urtaav639 2 ปีที่แล้ว +1

    Excelente video cubre la mayoría de temas acerca de la seguridad,pero tengo una duda bro, para una aplicación que tiene más roles como seria una buena forma de tener esos roles y no ponerlos directamente en el html o en los app routing??

    • @akotech
      @akotech  2 ปีที่แล้ว +5

      Sin saber el caso concreto, la cantidad de roles y como están relacionados entre si es difícil decirte.
      Si es un jerarquía directa de roles puedes optar por una guarda del tipo *hasMinimumRole(X)* , para no tener que añadir todos. Pero por ejemplo si tienes realmente muchos roles independientes entre si pero que comparten muchos permisos, pues quizás sería mejor solución asignar a las rutas y las acciones permisos en vez de roles y luego crear un servicio que chequee si el rol del usuario tiene ese permiso.
      un saludo y gracias por tu comentario 😉

  • @arnoldramirezzavaleta8813
    @arnoldramirezzavaleta8813 ปีที่แล้ว

    Muchas gracias por compartir tu conocimiento, has logrado que entienda lo que estuve buscando por días!! De casualidad vendes cursos en alguna plataforma? De ser así sería genial que puedas compartir los links. De no ser el caso te invito a que crees dichos cursos, tu forma de enseñar es muy buena. Saludos desde Perú

    • @akotech
      @akotech  ปีที่แล้ว

      Muchas gracias por tus palabras Arnold 😊.
      No lo descarto para un futuro, pero de momento no tengo ningún curso de pago.
      un saludo

  • @dieguillo6661
    @dieguillo6661 2 หลายเดือนก่อน

    interesante el video, tengo una consulta, si los roles los tengo en una base de datos y este lo obtengo mediante una api, cómo puedo implementarlo sin necesidad de colocar los roles en el código, solo necesito que me obtenga los roles de la base de datos?

    • @akotech
      @akotech  2 หลายเดือนก่อน

      Sin ver la implementación específica es difícil darte una respuesta concreta. Pero si no quieres hardcodear los roles en el código necesitarás crear algún tipo de diccionario con esos datos que obtengas de la bd del tipo {[accion/seccion]: rolesPermitidos[] } para poder validar si el rol del usuario le permite acceder a dicha sección o realizar una acción específica.
      un saludo y gracias por tu comentario

  • @neloxz
    @neloxz ปีที่แล้ว

    Muchas gracias por tu video. Tengo una pregunta, cuando se hace la redirección en el guard, ¿Cuál es la diferencia entre usar navigateByUrl y createUrlTree? Nunca había escuchado de este último, siempre lo hago con navigateByUrl.

    • @akotech
      @akotech  ปีที่แล้ว

      Hola Nelson!
      Los dos métodos tienen dos propósitos diferentes:
      - navigateByUrl sirve para iniciar manualmente una nueva navegación.
      - y createUrlTree simplemente crea un objeto UrlTree para una ruta determinada. (Objeto que estamos devolviendo desde la guarda, trasladando así al Router la responsabilidad de aplicar la redirección)
      Para el 99% de los casos el resultado final de usar uno u otro en una guarda es prácticamente idéntico. Es más las guardas en las primeras versiones solo podían devolver un booleano y si querías hacer una redirección la tenias que hacer iniciando manualmente la navegación.
      un saludo

  • @antoniolea3270
    @antoniolea3270 5 หลายเดือนก่อน

    Excelente video, tengo una duda ahora con las functional guards "export const authGuard: CanActivateFn = (route, state) => {}", como podría recibir los roles en los parámetros pero sin perder route ni state. canActivate: [authGuard('admin')] ?

    • @akotech
      @akotech  5 หลายเดือนก่อน +1

      Sería igual que la guarda funcional hasRoles que hacemos en el video (13:35), pero definiendo en esa función interna los parámetros. En este caso en el video no los hemos añadido simplemente porque no los estábamos usando.
      Te quedaría algo así:
      function authGuard(roles) : CanDeactivateFn {
      return (route, state) => {}
      }
      o
      const authGuard = (roles): CanDeactivateFn => (route, state) => {}
      un saludo y gracias por tu comentario 😉

  • @jhosuaespinoza3327
    @jhosuaespinoza3327 ปีที่แล้ว

    Un crack!!! tienes el video donde creas el LogIn del proyecto?

    • @akotech
      @akotech  ปีที่แล้ว

      No lo siento. Pero si te sirve, en la descripción tienes el enlace al repositorio con todo el código.
      un saludo y gracias por tu comentario 😉

  • @jhonnatanzevallos621
    @jhonnatanzevallos621 ปีที่แล้ว

    Muy bueno el contenido, gracias por compartirlo. Tenes algun curso en alguna plataforma?

    • @akotech
      @akotech  ปีที่แล้ว +1

      Entra dentro de mis planes hacer alguno, pero de momento no tengo.
      un saludo y gracias por tu comentario.

  • @MarcoAntonioTiconaRios
    @MarcoAntonioTiconaRios ปีที่แล้ว

    hola excelente explicación como podría implementar el inject del Router aparte del authService para redirigir a otra pagina al usuario en caso de no tener los roles correspondientes estoy teniendo problemas con eso

    • @akotech
      @akotech  ปีที่แล้ว +1

      Solo tienes que añadir otro inject antes de devolver el observable desde la función interna y usar este para en el caso false devolver el UrlTree de la nueva ruta a la que quieras redireccionar, de forma similar a como hacemos en la guarda del login.
      La guarda para redireccionar en el ejemplo de video al dashboard en caso de que no tenga el rol quedaría así:
      export function hasRole(allowedRoles: Role[]) {
      return () => {
      const router = inject(Router); //
      Boolean(user && allowedRoles.includes(user.role)) ||
      router.createUrlTree(['/dashboard']) //

    • @MarcoAntonioTiconaRios
      @MarcoAntonioTiconaRios ปีที่แล้ว +1

      @@akotech perfecto muchas gracias

  • @ykristianhd
    @ykristianhd 2 ปีที่แล้ว

    Tengo una pregunta, si todas las guardas y roles se maneja del lado del cliente, eso no podria ser modificado desde las devtools y acceder a las vistas protegidas sin tener el rol solicitado? Solo he hecho manejo de roles y autorización en el backend

    • @akotech
      @akotech  2 ปีที่แล้ว +2

      Por supuesto, como digo al principio del video, RBAC en el frontend lo tenemos que considerar más como un tema de UX que de seguridad. Porque aunque pueda servir para restringir el acceso a los usuarios digamos normales, cualquier usuario con un poco de conocimiento en la materia puede sobrepasarlo relativamente fácil.
      El RBAC del backend tiene que existir siempre y es el realmente importante. Esto es algo que he intentado recalcar en el video en el minuto 2:10 donde aunque un usuario no identificado pueda acceder a los pedidos, el listado de los mismos no se descarga porque la petición http devuelve error. A lo mejor tenia que haber sido más explicito.
      Un saludo y gracias por tu comentario 😉!

    • @ykristianhd
      @ykristianhd 2 ปีที่แล้ว

      @@akotech Muchas gracias por tu respuesta, me queda claro

  • @MartinReyes-il1gl
    @MartinReyes-il1gl 9 หลายเดือนก่อน

    y si en lugar de canLoad utilizo CanActivate cambia algo?

    • @akotech
      @akotech  9 หลายเดือนก่อน +1

      Ambos tipos de guardas tienen un propósito distinto. El propósito de canLoad es prevenir la descarga de un módulo lazy asociado a una ruta si el usuario no tiene la autorización pertinente; y el de canActivate es prevenir la renderización de cierto componente.
      Si solo usas canActivate, un usuario llamémosle normal, no va a notar una diferencia notable. El único problema que puedes tener, es que todos los módulos lazy se van a descargar siempre que un usuario acceda a esas rutas asociadas, tenga o no permiso para ello. Esto conlleva que el código fuente de dichos módulos estará disponible desde ese momento en el navegador, y algún usuario curioso podría obtener alguna información relativamente sensible que tengas _hard-coded_ en los elementos de dicho módulo.
      un saludo y gracias por tu comentario.

  • @alexdisd5670
    @alexdisd5670 10 หลายเดือนก่อน

    te amo

    • @akotech
      @akotech  10 หลายเดือนก่อน

      🤣

  • @enriqueruiz320
    @enriqueruiz320 ปีที่แล้ว

    Hola, tienes cursos en línea? SALUDOS

    • @akotech
      @akotech  ปีที่แล้ว

      Hola Enrique, tengo planeado hacer un par de ellos a lo largo de este año, pero de momento no tengo ninguno.
      un saludo

  • @dragonstore6308
    @dragonstore6308 ปีที่แล้ว

    Como hacer para que al recargar la pagina nose pierda el inicio de sesion y todo funciuone correctamente

    • @akotech
      @akotech  ปีที่แล้ว +2

      En el repositorio de este mismo proyecto tienes un ejemplo de cómo puede conseguirlo.
      Si vas al archivo del AuthService, verás que en cuando hacemos un login satisfactorio guardamos el token recibido en el localstore del navegador.
      Y para volver a cargar ese token guardado cuando se refresque la pagina, recuperamos este desde el constructor del servicio y lo pusheamos en el observable del usuario.
      Si vas a implementar un patrón similar a este te recomiendo, eso sí, que al recuperar el token del localstorage, antes de pushearlo al observable lo re-valides contra el servidor para asegurarte que sigue siendo correcto.
      un saludo y gracias por tu comentario.