Dúvida sobre o pundit

62 views
Skip to first unread message

eltin182

unread,
Aug 18, 2016, 4:48:35 PM8/18/16
to rails-br
Fala galera blz? To fazendo um controle de acesso com o pundit e surgiu uma duvida aqui, acho q nao to fazendo corretamente.
Seguinte, tenho o managers_controller.rb e o editors_controller.rb, neles tem index, edit, show....
Dai eu entro com o usuario manager, ele nao pode acessar nada do editor e vice versa. Ok, so q eu to fazendo assim:

class ManagerPolicy < ApplicationPolicy

  def index?
    user.manager? or user.admin?
  end

  def.edit?
   (...)

  def new?
   (...)

class EditorPolicy < ApplicationPolicy

  def index?
    user.editor? or user.admin?
  end

  def.edit?
   (...)

  def new?
   (...)

Ou seja, pra cada metodo tenho q definir quem terá permissao, pois se eu nao fizer isso o cara com outro nivel de acesso pode simplesmente acessar pela URL e pronto! Só que se eu tiver inumeros métodos da um trabalho ENORME! Existe alguma forma de bloquear logo tudo apartir do /managers e do /editors, por exemplo? Vlwwwww!!

eltin182

unread,
Aug 22, 2016, 9:56:58 AM8/22/16
to rails-br
ping

eltin182

unread,
Sep 8, 2016, 10:17:46 AM9/8/16
to rails-br
ping

Guilherme Albuk

unread,
Sep 8, 2016, 12:04:00 PM9/8/16
to rail...@googlegroups.com

   Use Headless Policies, que são permissões que não estão ligadas a nenhum model, como já está fazendo, mas sempre apontando o controller para o um único método das Policies. E como bônus, verificar se todo método do controller rodou autorização.

Fciaria assim:

class ManagerPolicy < ApplicationPolicy
def all?
user.manager? or user.admin?
end
end

class EditorPolicy < ApplicationPolicy
def all?
user.editor? or user.admin?
end
end

class ManagersController < ApplicationController
before_action { authorize :mamager, :all? }
after_action :verify_authorized
end

class EditorsController < ApplicationController
before_action { authorize :editor, :all? }
after_action :verify_authorized
end

Abraço!
Guilherme Albuk


Em 8 de setembro de 2016 11:17, eltin182 <elton.me...@gmail.com> escreveu:
ping

--
--
Você recebeu essa mensagem porquê está inscrito no Google
Groups "rails-br".
Para enviar uma mensagem para o grupo, mande um email para rail...@googlegroups.com
Para se descadastrar, mande um e-mail para
rails-br+unsubscribe@googlegroups.com
Visite o grupo em http://groups.google.com/group/rails-br?hl=pt-BR
Leia nossa política de uso: http://goo.gl/YGgt7

---
Você recebeu essa mensagem porque está inscrito no grupo "rails-br" dos Grupos do Google.
Para cancelar inscrição nesse grupo e parar de receber e-mails dele, envie um e-mail para rails-br+unsubscribe@googlegroups.com.
Para mais opções, acesse https://groups.google.com/d/optout.

Guilherme Albuk

unread,
Sep 8, 2016, 1:41:13 PM9/8/16
to rail...@googlegroups.com

   Oi, Elton.

   Fiz duas melhorias na sugestão que mandei anteriormente. Primeiro, como você quer aplicar a autorização para todo e qualquer método que você venha a criar, você garante isso usando a autorização no before_action. Nesse caso você pode também colocar a verificação de autorização no before_action, melhorando a segurança.

   E outra melhoria foi usar o lonely operator (Ruby 2.3+) na verificação de usuário. Isso é necessário para o caso do usuário não estar logado, pois o current_user vai ser NilClass e você vai chamar métodos que não existem nele, causando um erro.

   Me diga se resolveu o seu problema.

   Abraço!
   Guilherme Albuk
class ManagerPolicy < ApplicationPolicy
def all?
    user&.manager? or user&.admin?

end
end

class EditorPolicy < ApplicationPolicy
def all?
    user&.editor? or user&.admin?

end
end

class ManagersController < ApplicationController
before_action { authorize :mamager, :all? }
  before_action :verify_authorized
end

class EditorsController < ApplicationController
before_action { authorize :editor, :all? }
  before_action :verify_authorized
end

eltin182

unread,
Sep 8, 2016, 2:20:46 PM9/8/16
to rails-br
Deu certo sim, Guilherme, muito obrigado mesmo pela ajuda. Eu ja inclusive comitei as coisas:


O problema que no meio de tudo isso, tive que mudar totalmente o pundit, e agora complicou TUDO de vez.
Antes eu estava esperando que o nivel de acesso seria por tipo de usuário, porém no meio da coisa, acabo descobrindo que o nível de acesso é por perfil/funcionalidade do usuário. E por isso eu nao sei como que faz e também nem sei se o pundit me atende...

Seria isso aqui agora:

Tipo de usuário:
manager
editor
admin

Dai existirão, por exemplo, varios usuários editors, cada usuário pode ter perfil diferentes, pra isso basta que contenham funcionalidades diferentes. Exemplo
Editor 1
  - perfil X
    - funcionalidade A, B e C

Editor 2
  - perfil Y
    - funcionalidade A, C e D

Dai o nivel de permissao fica complicado dessa forma, ja q nao é apenas dizer qual método e pronto. Eu fiz isso ai e joguei nesse app teste, mas nao to conseguindo avançar mais :(
Obrigado cara!

Guilherme Albuk

unread,
Sep 8, 2016, 3:04:38 PM9/8/16
to rail...@googlegroups.com

   O que você precisa primeiramente é definir os Models de Perfis e Funcionalidades.

   Aí cada método do controller vai acabar correspondendo a uma funcionalidade. Aí é verificar diretamente a funcionalidade.

def create?
   user.perfil.funcionalidade?('create_something')
end

   É trabalhoso, mas dá para fazer. Eu sugiro que você crie um método no Perfil que você passe o nome da funcionalidade e ele verifique se ela pertence a esse perfil. Ou pode inferir o nome da funcionalidade necessária a partir do nome do controller + o método, por exemplo Posts#create.

   Abraço!


--
Reply all
Reply to author
Forward
0 new messages