As convenções do Pundit, na documentação dele: uma classe de policy por model

Prévia grátis 3 min de leitura

Uma gem conhecida, não instalada neste app

O Pundit é uma gem de autorização Ruby muito usada, com mais de dez anos e ainda mantida. O Gemfile e o Gemfile.lock deste app não têm linha pundit; o app nunca o instalou. Antes de comparar qualquer coisa, este curso lê as convenções do Pundit no README do GitHub dele (github.com/varvet/pundit). Autenticação: Rails 8 fez o mesmo com os templates do gerador.

Uma classe de policy, com o nome do model que ela autoriza

O README do Pundit enuncia a regra central com clareza: "The class has the same name as some kind of model class, only suffixed with the word 'Policy'." O exemplo básico:

class PostPolicy
  attr_reader :user, :post

  def initialize(user, post)
    @user = user
    @post = post
  end

  def update?
    user.admin? || !post.published?
  end
end

Post ganha PostPolicy. O initialize(user, post) recebe dois argumentos: quem pergunta, e sobre o que pergunta. O update?, terminado em interrogação, devolve true ou false: uma checagem de permissão, com o nome da ação que ela protege.

ApplicationPolicy: a classe base que o gerador do Pundit produz

Apps Rails que instalam o Pundit rodam rails g pundit:install, que gera uma ApplicationPolicy da qual todas as outras policies herdam. Escrita sobre essa base, a mesma policy fica assim:

class PostPolicy < ApplicationPolicy
  def update?
    user.admin? or not record.published?
  end
end

Na ApplicationPolicy gerada, segundo a documentação do Pundit, "the model object is called record". É um nome genérico, já que a ApplicationPolicy não sabe de antemão que model cada subclasse autoriza.

Onde essas classes ficam

A convenção do Pundit põe cada policy em app/policies/, um arquivo por model: post_policy.rb para Post, comment_policy.rb para Comment. Este app já tem um diretório app/policies/, com vinte arquivos. As aulas 3 e 4 leem os quatro com Policy no nome e passam pelos outros.

O que este curso cobre

Sete aulas, começando pelas convenções do Pundit na documentação dele. Esta aula trata das classes de policy e da ApplicationPolicy. A aula 2 trata da integração com controllers: authorize, policy_scope e Pundit::NotAuthorizedError. Depois vêm as policies feitas à mão deste app. A aula 3 trata de Identity::UserPolicy e Community::CommentPolicy, policies de controle de acesso, e de onde são chamadas. A aula 4 trata de mais dois arquivos com Policy no nome que respondem outra pergunta. Também trata dos dezesseis arquivos ao lado deles, que nem são policies no sentido do Pundit. A aula 5 põe o formato a que este app chegou sozinho ao lado do formato do Pundit. A aula 6 trata do que adotar o Pundit mudaria, incluindo uma diferença de nome no código deste app hoje. A aula 7 junta tudo, com um pequeno desafio em Ruby baseado na lógica de controle de acesso deste app.

Aula 1 de 7 · grátis

Continue com a aula 2

A integração do Pundit com controllers: authorize, policy_scope e NotAuthorizedError

Trata de authorize, do rescue compartilhado de Pundit::NotAuthorizedError, do policy_scope com Scope aninhada e do verify_authorized.

Com uma conta grátis você também tem os quizzes, seu progresso e suas anotações, e a discussão.

Digite para buscar...