Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Decorator @injectable com propriedade providedIn: 'root' vs Segurança

Um detalhe que me chamou atenção na Aula 2 - Login sobre o decorator @Injectable e quero saber se a minha preocupação faz sentido.

O instrutor informou sobre o default do angular em colocar a propriedade providedIn como 'root', ou seja, essa classe fica visível em todo projeto. Porém, neste caso específico, em que estamos tratando de um serviço de autenticação, não seria mais prudente deixar essa classe visível somente para o componente de login? É possível fazer isso? Se sim, como ?

1 resposta
solução!

Oi, tudo bem?

Sua preocupação em relação ao uso do decorator @Injectable com a propriedade providedIn definida como 'root' é válida. Vamos explorar essa questão e discutir as melhores práticas para garantir a segurança em um serviço de autenticação.

O decorator @Injectable é utilizado em classes que possuem dependências injetáveis no Angular. Ao definir a propriedade providedIn como 'root', a classe é registrada no injetor raiz do Angular, tornando-a disponível em todo o projeto. Essa abordagem é conveniente para serviços que precisam ser compartilhados por vários componentes, pois evita a necessidade de declará-los manualmente em módulos ou componentes específicos.

No entanto, em casos específicos, como um serviço de autenticação, é compreensível que você queira restringir o escopo da classe para um componente ou módulo específico, a fim de garantir a segurança e o controle adequados. Felizmente, o Angular oferece opções para isso.

Uma abordagem para restringir a visibilidade do serviço de autenticação apenas ao componente de login é utilizar a propriedade providedIn com o valor do próprio componente em vez de 'root'. Vamos ver um exemplo prático:

import { Injectable } from '@angular/core';

@Injectable({
  providedIn: LoginComponent
})
export class AuthService {
  // Implementação do serviço de autenticação
}

No exemplo acima, definimos o valor de providedIn como LoginComponent, que é o nome do componente de login. Dessa forma, o serviço AuthService estará disponível apenas para o componente LoginComponent e seus filhos. Outros componentes não terão acesso a ele.

Além disso, é necessário garantir que o módulo que contém o LoginComponent esteja importando e fornecendo o serviço AuthService corretamente. Isso pode ser feito no módulo do componente de login da seguinte maneira:

import { NgModule } from '@angular/core';
import { LoginComponent } from './login.component';
import { AuthService } from './auth.service';

@NgModule({
  declarations: [LoginComponent],
  providers: [AuthService]
})
export class LoginModule { }

Dessa forma, o módulo do LoginComponent será responsável por fornecer o AuthService, tornando-o disponível para o próprio componente e seus filhos.

Ao restringir a visibilidade do serviço de autenticação dessa maneira, você está seguindo uma abordagem mais segura e controlada, limitando o acesso ao serviço apenas ao componente necessário. Isso pode ser especialmente útil em cenários em que você deseja garantir que somente o componente de login tenha acesso às informações de autenticação, mantendo outros componentes separados e protegidos.

É importante ressaltar que essa é apenas uma abordagem para lidar com a visibilidade de serviços no Angular, e outras estratégias podem ser aplicadas dependendo das necessidades do seu projeto.

Espero que tenha te ajudado, bons estudos!

O post foi fechado pois o curso foi descontinuado e não faz mais parte da grade oficial