# 4. Segurança

O **Cat UI** possui um Guardião próprio, onde já integra com o fluxo de autenticação também nativo, seja utilizando **JWT** ou [`OpenID`](https://doc.catui.igordrangel.com.br/comece-por-aqui/4.-seguranca/openid-opcional)`.`

### Uso

```typescript
import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { CatAuthGuard } from '@catrx/ui';
import { PageExampleComponent } from './page-example.component';

const routes: Routes = [
  { path: '', component: PageExampleComponent, canActivate: [CatAuthGuard] },
];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule],
})
export class PageFormRoutingModule {}
```

### Politicas

Visando rotas mais profundas e que precisam também ter a permissão validada (como rotas de edição de dados), foi criado o **sistema de políticas** que já está acoplado ao **Guardião**.&#x20;

Sempre que quiser **proteger uma rota**, utilize o **Guardião**, porém, o mesmo irá por padrão **validar apenas se o usuário encontra-se autenticado e se a rota acessada encontra-se liberada no menu**, caso contrário, ele irá validar nas **políticas** (se a mesma possui permissão), caso não tenha políticas configuradas ou a rota não esteja liberada, a mesma será recusada.

#### Uso das políticas

{% hint style="info" %}
O local de implantação recomendado é após a autenticação, junto do fornecimento das configurações menu.
{% endhint %}

{% code title="app.service.ts" lineNumbers="true" %}

```typescript
import { Injectable } from '@angular/core';
import { AppConfigMenu, AppNotification, CatAppDecodedToken, CatRoutePolice } from '@catrx/ui';
import { Observable } from 'rxjs/internal/Observable';

@Injectable({ providedIn: 'any' })
export class AppService {
  ...
  
  public getMenu(decodedToken: CatAppDecodedToken) {
    this.buildPolices(decodedToken);
    ...
  }
  
  private buildPolices(decodedToken: CatAppDecodedToken) {
    CatRoutePolice.police = (path: string) => {
      return (
        decodedToken &&
        !!['/components/toolbar/'].find(
          (validPath) => path.indexOf(validPath) >= 0
        )
      );
    };
  }
}
```

{% endcode %}

{% hint style="info" %}
Em **CatRoutePolice.police**, será solicitada uma função, onde será passado por parâmetro a rota acessada no momento para que você possa validar se a mesma está dentro de suas políticas de acesso, devendo assim, retornar um **boolean**, onde **true** permite o acesso e **false** bloqueia.
{% endhint %}
