Los guards son scripts que implementan una estrategia de seguridad para accesos no autorizados a las deferentes rutas de nuestra aplicación. Se crean de manera similar a los servicios y componentes, con el siguiente comando de AngularCLI:
ng generate guard <directorio>/<nombre-del-guard>
Resultando en la creación de los archivos: <nombre-del-guard>.specs.guard.ts y <nombre-del-guard>.guard.ts
El guard se basa en un atributo llamado canActivate que, dependiendo de una condición o expresión buleana, retornará verdadero o falso al constructor del componente en el que se haya inyectado para indicarle cuando deberá mostrar o no el contenido de dicho componente.
//private _myheader = new Headers({'Authorization':`bearer ${localStorage.getItem('token')}`})constructor(private_http:Http){}postAuth(username,password){let body =`username=${username}&password=${password}&grant_type=password`;let options =newRequestOptions({headers:this._headers});returnthis._http.post(this._authUrl,body,options).map(res=>{let user = res.json();if(user && user.access_token){localStorage.setItem('token', user.access_token);}return user;});}postConfirm(username,password){let body =`username=${username}&password=${password}&grant_type=password`;let options =newRequestOptions({headers:this._headers});returnthis._http.post(this._authUrl,body,options).map(res=> res.json());}//TODO: mandar la request por authHttp para no tener que enviar los headers a mano cada vezgetUserDetails(username,token){let _myheader =newHeaders({'Authorization':`bearer ${token}`})let options =newRequestOptions({headers: _myheader});returnthis._http.get(this._getUserUrl+ username, options).map(res=>{let user = res.json();if(user){localStorage.setItem('fullName', user.fullName);localStorage.setItem('userName', user.userName);localStorage.setItem('email', user.email);localStorage.setItem('level', user.level);localStorage.setItem('roles', user.roles);localStorage.setItem('departamento', user.departamento);localStorage.setItem('puesto', user.puesto);}return user;});}
}
¿cómo evito que ingresen al login una vez que ya iniciaron sesión?
Yo generé un AuthGuard con un canActivate de esta forma:
isAuth(noAuth =false){returnthis._store.select('auth').pipe(map(auth=>{let today =newDate();let authData = auth.authData? auth.authData:{};const userData = authData.user? authData.user.Role.name:{};let expDate = authData.exp?newDate(authData.exp):newDate();let isAuth = authData.token&& today < expDate;if(noAuth){// si el usuario no esta autenticado le permite ver la vista del login isAuth =!isAuth;}if(!isAuth &&!noAuth){// si el token expiró cierra la sesion del usuariothis.logout();}elseif(!isAuth && noAuth){// si el usuario esta autenticado y quiere acceder a login lo manda al homethis._router.navigate(['/'+ userData.toLowerCase()]);}return isAuth;}));}
Otra solucion comun es tener dos Guard, un AuthGuard y un NoAuthGuard, eso simplificaria la logica de poner todo en uno solo.
El .then no funciona de la misma forma ya que me dice que la Promise<void> como se debería de hacer en Angular 8? Creo que cuando le doy click a logout() no me cierra la sesión ya que si escribo localhost:4200/home me aparece la pantalla de home y el boton Logout tambien, no se si sea problema de mi metodo logout() en home.component.ts que no puedo ponerle el .then o si sea problema de mi authentication.guard.ts que no esta funcionando.
Tengo la siguiente duda. Si yo hago login a usuarios mediante Facebook no puedo almacenar los datos como nick, email y password. Como podria hacer esto? O si conocen alguien que lo haga o alguna referencia buena me dicen. Gracias
ng g g services/authentication
Al crear correr (ng g g services/authnetication)
se me agregar algo como esto (UrlTree) , que funcionalidad tiene ?
Al escribir la instruccion ng g g services/authentication si me crea los dos archivos pero vienen sin el implements y el metodo canActivate, que parámetro necesito pesarle al CLI o de que forma me crea los métodos? Probé con el espacio pero no me sale ninguna opción.
se debe a que escribres ng g g, la sigla sola de G es para el generate, no para el guard, por lo que el considera que debe crear un servicio normal