há algum padrão referente a controle de acesso?

Blz, galera

eu tô reconstruindo um sistema utilizando MVC. Nesse sistema, os usuários possuem perfis e, dependendo desse, podem ou não executar certas ações. Entretanto, em alguns casos, uma mesma ação pode ser executada por usuários de diferentes perfis, mas o comportamento da ação é diferente. Para isso, estou usando o Strategy pattern. Apesar de estar estudando padrões agora pra tentar fazer um sistema bem feito, há uma parte do sistema que não consigo resolver.

Eis meu problema:
Eu gostaria de permitir ao usuário construir perfis em alto-nível, com todas as permissões, negações e até troca de comportamentos, sem que ele, obviamente, tenha que digitar uma linha de código; e que esse código fosse gerado pelo sistema e o novo perfil fosse criado como desejado pelo usuário. Porém, eu acredito que eu consiga fazer isso, mas no meu sistema, essa parte de permissão/negação é feita através de if’s, e desse jeito não há como adicionar um if dentro um código em alto-nível.

Há algum padrão que possa me ajudar nisso?

ñ é primordial mas quais tecnologias você irá usar?

Existem várias formas de fazer isso. Da uma olhada nesses links que vão te dar uma luz.


PS: Não fique preso a essas opções, mas se alguma te atender, siga em frente.

Antes de tudo, quero dizer que ainda não li suas indicações, emerson, porém eu já aplico ACL no meu programa.

Respodendo ao 1º questionamento, o sistema é feito pra internet e estou utilizando Struts.

Até onde eu sei, o ACL é um sistema de permissão/negação e torna esse trabalho mais fácil, mas meu problema é um pouco maior que isso e eu queria que envolvesse mudança de comportamento da ação. Entretanto, o essencial é eu poder tirar os if’s e poder fazer algo mais OO, que permitisse a extensão e a manutenção do programa, pois não sei qto tempo vou trabalhar nele e não quero que o próximo tenha a mesma dificuldade que eu tenho ao mexer no sistema atual.

Enfim, vou ler os dois links, mas se alguém tiver alguma idéia sobre como tirar os if’s ou se não tiver entendido meu problema, respondam, eu tenho o maior interesse em explicá-lo.

Vlw.

Controle de acesso não é essencialmente perguntar “usuario tem permissão para executar tal ação/acessar tal recurso” e responder com um booleano?

A partir daí eu encapsularia essa pergunta para um único método, e este arranjaria de responder a pergunta.

Sobre como tornar mais OO depende de como o sistema é implementado, mas geralmente começa com um “Negar Tudo”, e cada configuração vai abrindo as portas. No Role-based, caso a pessoa esteja em pelo menos um papel que permita a ação, ele é autorizado. Um ACL é mais específico, caso a própria pessoa tenha o acesso, ele é autorizado.

Dá pra juntar os dois também, checar primeiro na RBAC, depois na ACL, e a ACL por ser mais específica, tem preferencia(digamos por exemplo que o papel permite a ação, mas a ACL especificamente o impede, ACL ganha neste caso).

Acho que nestes casos, você tornaria o sistema mais OO fazendo mais delegações à outras partes do sistema, deixando de tratar tudo em um só lugar. Em outras palavras, criando classes com responsabilidades mais específicas.

[quote=rickypaz]Antes de tudo, quero dizer que ainda não li suas indicações, emerson, porém eu já aplico ACL no meu programa.

Respodendo ao 1º questionamento, o sistema é feito pra internet e estou utilizando Struts. [/quote]
Ok, então seu problema não é sobre Controle de Acesso e sim sobre Orientação a Objetos. :wink:

[quote=rickypaz]
… Entretanto, o essencial é eu poder tirar os if’s e poder fazer algo mais OO, que permitisse a extensão e a manutenção do programa, pois não sei qto tempo vou trabalhar nele e não quero que o próximo tenha a mesma dificuldade que eu tenho ao mexer no sistema atual. [/quote]
Em sistemas web, o que se faz geralmente é colocar filtros nas URIs para verificar a permissão, sem precisar ficar poluindo seu código, pensando num caso simples. Se você precisar de algo mais complicado, que necessite de muitas verificação não possíveis de tratar usando apenas as URIs do sistema e tenha que intervir no código, talvez AOP seja uma solução pro teu caso.

Além das soluções apontadas pelo Emerson, o padrão proxy também pode ser usado para essa situação.