Pular para o conteúdo principal

Autenticação e Autorização

A autenticação e a autorização no Nerdify são construídas sobre dois pilares principais:

  • Devise Token Auth para autenticação com tokens JWT renováveis
  • Cancancan para definição e gestão de permissões

🔑 Autenticação com JWT (Devise Token Auth)

O mecanismo de autenticação adotado pelo Nerdify utiliza a gem devise_token_auth, que permite autenticação via API utilizando JWT e cabeçalhos personalizados. Esse fluxo é compatível com aplicativos frontend desacoplados, como os criados em Angular.

⚙️ Funcionamento

  • O usuário realiza login via requisição POST para /api/v1/session
  • Recebe no cabeçalho da resposta os tokens: access-token, client, uid
  • Esses cabeçalhos são enviados em todas as requisições subsequentes para autenticar o usuário
  • A cada requisição válida, o token é renovado automaticamente

🕒 Por padrão, o token expira após 2 semanas de inatividade, ou é renovado automaticamente a cada requisição válida. Esse comportamento pode ser ajustado nas configurações do Devise Token Auth, alterando os valores de:

DeviseTokenAuth.setup do |config|
config.token_lifespan = 2.weeks
end

🧠 O frontend gerenciado pelo Nerdify cuida automaticamente de enviar e renovar os tokens.

🔧 Configuração

O devise já vem pré-configurado nos projetos gerados pela CLI do Nerdify. Mas ajustes podem ser feitos no arquivo:

config/initializers/devise_token_auth.rb

O modelo de usuário deve incluir:

acts_as_user

Esse comportamento é detalhado na seção de modelos.


👥 Métodos current_user e current_ability no ciclo de vida

Durante o ciclo de vida de uma requisição, o Nerdify define automaticamente os métodos current_user e current_ability, disponíveis:

  • No controlador
  • No modelo principal da requisição (aquele correspondente ao controlador)
  • No template renderizado, para os componentes que suportam lógica condicional

⚠️ Importante: Apenas o modelo principal da requisição possui acesso direto a current_user e current_ability. Em requisições com múltiplos níveis (ex: /api/v1/companies/:company_id/customers/:id), os métodos estarão disponíveis apenas em Customer, e não em Company nem em modelos filhos como Address.

Se dentro de um modelo filho (por exemplo, Address) for necessário acessar esses objetos, será preciso que o modelo principal (Customer) os repasse explicitamente.

💡 Esses objetos são fundamentais para aplicar lógicas de autorização. Além disso, o current_user é automaticamente incluído dentro do bloco resources da resposta da página, permitindo ao frontend ter acesso direto às informações do usuário logado.


🛡️ Autorização com Cancancan

O Nerdify utiliza a gem cancancan para gestão de permissões. As regras de autorização devem ser definidas na classe Ability, localizada em:

app/models/ability.rb

A instância de Ability é gerada automaticamente com base no current_user e outros parâmetros, permitindo definir permissões dinâmicas.

🧾 Sintaxe

Permissões são definidas usando:

can :read, Post
can :update, Comment, user_id: user.id
cannot :destroy, Admin

📚 Para mais exemplos e opções, consulte a documentação oficial: https://github.com/CanCanCommunity/cancancan


🔒 Uso da autorização no Nerdify

🧠 No backend do modelo (callbacks, validações, lógicas)

O modelo principal do controlador recebe automaticamente:

  • current_user
  • current_ability

Isso permite, por exemplo:

before_create do
raise "Proibido" unless current_ability.can?(:create, self)
end

🧩 Em componentes e templates (condicional de renderização)

No template da página, é possível condicionar a exibição de componentes com o uso da opção backend_if::

backend_if: "can? :new, model"
backend_if: "can? :edit, object"
backend_if: "current_user.present? && current_user.profile == 'admin'"

Essas expressões são avaliadas dinamicamente com base nos objetos disponíveis dentro do controlador, modelo e da página durante a renderização do page_json.

🧰 Objetos disponíveis para o backend_if

  • model: o modelo da página
  • object: a instância do objeto principal da página
  • objects: a coleção de objetos da página
  • current_user: usuário autenticado
  • current_ability: instância da Ability com permissões
  • params: parâmetros da requisição

✅ Com essa estrutura, o Nerdify garante segurança, reutilização e clareza na definição de quem pode acessar o quê dentro do sistema, com suporte tanto no backend quanto no frontend.