# 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`](/comece-por-aqui/4.-seguranca/openid-opcional.md)`.`

### 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 %}


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://doc.catui.igordrangel.com.br/comece-por-aqui/4.-seguranca.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
