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
POSTpara/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_userecurrent_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 emCustomer, e não emCompanynem em modelos filhos comoAddress.
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_usercurrent_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áginaobject: a instância do objeto principal da páginaobjects: a coleção de objetos da páginacurrent_user: usuário autenticadocurrent_ability: instância da Ability com permissõesparams: 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.