Melhor forma de armazenar profile em sessão

38 views
Skip to first unread message

Matheus Lima

unread,
Nov 13, 2012, 9:34:59 PM11/13/12
to django...@googlegroups.com

Boa noite,

Pessoas, estou criando um sistema onde o usuário terá um ou mais profiles.

Todo o conteúdo do sistema é associado a um profile. Cada usuário só enxerga o que pertence ao profile logado.

A parte de separação do conteúdo está ok, assim como a modelagem.

A minha dúvida é sobre qual a melhor forma de fazer a verificação se o usuário escolheu um profile. Eu pensei em algumas soluções, como: criar um decorator (ficaria muito repetitivo), atrelar ao backend de autenticação (não gostei muito dessa) ou criar um middleware depois da camada de autenticação para verificar se o usuário escolheu um profile.

Eu acho que a solução do middleware seria mais limpa pra aplicação, porém tem páginas que são públicas, como a página inicial, contato e a tela de login.


Alguém tem alguma sugestão ou algum exemplo de código?

--
Att,

Matheus dos Santos Lima     


Elyézer Mendes Rezende

unread,
Nov 14, 2012, 4:49:08 AM11/14/12
to Lista Django Brasil
Pelo que entendi, creio que você possa usar grupos para resolver o problema.

Se o usuário está no profile1 (grupo1) ele tem certas permissões que permitem ver tudo relacionado ao profile1. Se estiver no profile2 também, estará no grupo2 e terá outras permissões que permitem que veja outros conteúdos.

O trabalho que você vai ter será adicionar os usuários no grupo e marcar as views com as permissões requeridas.

Abraço


2012/11/14 Matheus Lima <mathe...@gmail.com>
--
 
 



--
Elyézer Rezende
http://elyezer.com

Vinicius Assef

unread,
Nov 14, 2012, 6:41:07 AM11/14/12
to django...@googlegroups.com
Para maior flexibilidade de um sistema de permissões, tente não fazer checagens do tipo "usuário logado pertence ao grupo 1?".

Ao invés disso, teste se "usuário logado tem a permissão X". Isso dá mais liberdade para implementar grupos (ou profiles) conforme a necessidade do negócio, sem implicar em mudança no seu código-fonte.

Talvez, na situação do Matheus, faça algum sentido para um log, mas nunca encontrei um sentido para testar permissões mesmo. E se você encontrar, no futuro terá que criar algumas exceções. A não ser que seu sistema tenha permissões realmente muito simples.

Algumas exceções que já me deparei foram: "o usuário fulano pertence ao grupo 1, mas eu não quero que ele tenha acesso à tela X". Se isso acontecer um dia (e acredite, é muito comum), seu esquema de verificação por grupos vai por água abaixo. Outra situação que foge à regra das permissões por grupos, mas não à rotina da empresas é "só o gerente fulano pode aprovar isso, mas ele vive em reunião. Então, a secretária dele tem o usuário/senha dele e aprova no lugar dele." Bem, nem preciso explorar muito esse cenário, né?

Com os testes por permissão, ao invés de por grupo, é possível lidar com situações que adicionem/retirem permissões a/de um determinado usuário, sem precisar mexer em seu código-fonte.

Mas, para isso, no caso do Django, é necessário um backend de autenticação que trate essa situação.

Para quem quiser expandir os estudos nesse assunto: http://en.wikipedia.org/wiki/Rbac

Fica a dica.

--
Vinicius Assef



2012/11/14 Elyézer Mendes Rezende <elye...@gmail.com>

--
 
 

Matheus Lima

unread,
Nov 14, 2012, 3:54:26 PM11/14/12
to django...@googlegroups.com

Não sei se me expressei bem, mas a parte de permissões não quero alterar. O perfil do usuário não é um grupo.

Seria algo como: Um sistema de vendas que será utilizado por vários vendedores. Cada vendedor terá no mínimo uma "loja" (isso seria o perfil). Com o mesmo login, o usuário pode ter N "lojas", mas assim que logar, ele deve escolher qual loja ele quer acessar, pois ele só pode ver o conteúdo de uma loja por vez.

A minha dúvida é o seguinte: Eu quero que assim que o usuário logue, seja solicitado a escolher uma loja. Qualquer view que requerer login, solicita que o usuário escolha uma loja, caso ele não feito isso.


Eu pensei em armazenar em sessão algo como "current_store", com o id da loja dele. 


Não sei qual mecanismo utilizar. Eu poderia extender o backend de autenticação pra isso? Ou seria melhor criar um decorator "store_required" e decorar todas as views, para testar se a sessão é válida?



--
 
 
Reply all
Reply to author
Forward
0 new messages