Pergunta

Eu estou construindo um webapp com controle de acesso baseado em papéis usando Acegi segurança (Primavera). Então eu tenho diferentes usuários com funções: ROLE_ADMIN, ROLE_USER e etc.
No entanto, eu preciso implementar vários constrangimentos usuário.

Vamos considerar um exemplo:

Suponha que, há um site onde os usuários podem assistir a filmes online. Há usuários com funções ROLE_STANDARD_USER e ROLE_VIP_USER. Os usuários padrão podem assistir 3 filmes por semana e utilizadores VIP podem assistir a 10 filmes por semana, além de ter alguns outros privilégios. E há um usuário no grupo de usuário padrão a quem eu quero dar mais 2 filmes por semana. O número de filmes permitidos podem às vezes mudar.
Além disso, existem várias categorias de filmes: fantasia, comédia, clássico, novos filmes e etc. E eu quero que alguns usuários, independentemente do seu papel, têm acesso apenas a certas categorias. As categorias podem ser criadas e removidas dynamicaly.

Existem práticas padrão para implementar esse tipo de restrições do usuário?
Pode / deve ser feito usando funções de segurança Primavera e permissões?
Ou eu preciso considerar a adição de um motor baseado em regras para meu aplicativo?

Obrigado.

Editar:
O exemplo acima é fictício, meu projeto está preocupado com a concessão de acesso remoto para várias redes (e outros) equipamentos para os alunos. No entanto, os tipos de restrições de usuários são susceptíveis de ser o mesmo.
Infelizmente, o modelo para o acesso de usuário e restrições não está completa e estável. Num futuro próximo eu poderia ser dito para implementar várias restrições adicionais para os usuários, que não são conhecidos agora.
Então eu gostaria de selecionar um caminho agora que vai facilitar adição ou alteração de novas restrições de usuários no futuro e não exigiria revisão significativa do modelo interno ou estrutura de banco de dados. Se isso for possível.

Editar 2

Atualmente, as restrições básicas do usuário são codificados (sobra do sistema de prototipagem). Eu acho que eu vou tentar refatoração-lo primeiro a algum tipo de serviços empresariais parametrizadas objetos primeiro e depois pensar onde eu posso ir de lá. Além disso, vou considerar o uso de gerentes de decisão Spring Security de autorização.

Obrigado por todas as sugestões!

Foi útil?

Solução

Eu não esperaria que um sistema de segurança declarativa baseada em funções para dar o controle de grão fino você está procurando. Você já descritos muito poucos "regra de negócio" controles de acesso baseados você deseja implementar e nós poderia esperar ao longo do tempo essas regras para se tornar mais complexa. Então você precisa de uma combinação de informações do sistema de sub segurança (que é o usuário para este pedido? Quais os papéis que eles têm?), Mas, em seguida, combinar programaticamente que, com dados de negócios e regras (este usuário está entitiled para 2 filmes livres, se a data de hoje é neste intervalo).

A menos que eu definiria serviços em que encapsulam a lógica de negócios. A decisão sobre se a utilização de um motor de regras de pleno direito seria necessário um estudo mais aprofundado.

Outras dicas

Antes de perguntar a si mesmo que Acegi (ou uma regra do motor etc.) é o local correto para fazê-lo, eu acho que você precisa
analisar suas necessidades com precisão e completamente .

Considerando cada tópico ( por exemplo, limites sobre filme que podem ser vistas ), há um grande número de maneiras de implementar isso, e você precisa fazer escolhas funcionais. Não pode haver uma aplicação correcta menos que você já decidiu, em detalhes o que tem que ser feito!

Exemplo de um Modelo para as suas necessidades:

  • Limitar o número de filmes gerais por semana de acordo com o soma de :
    • O papel (3 ou 10)
    • bônus por usuário (padrão 0 se não for mencionado)
  • Atualize esses números, conforme necessário
  • Restringir os filmes a uma lista de categorias:
    • Se a lista é especificada para o usuário, usá-lo
    • Caso contrário, use a lista que é fornecida para o papel

Este exemplo tem muitas implicações, que podem ser correto ou inaceitável no seu caso.
Implicações:

  • depois de atualizar um número, o limite for alterado imediatamente.
  • não há nenhuma memória dos limites semanais, você não pode pedir isso para o passado (com estatísticas make por exemplo)
  • ...

Supondo que este modelo não se encaixa às suas necessidades, você está enfrentando o trabalho duro de criar um modelo que realmente se encaixa-los. Apenas uma vez que você tem, então pense sobre implementação.

Se você considerar Spring Security, esta é uma maneira que eu ver que você pode implementar sua solução. Implementar um AccessDecisionVoter para decidir sobre o acesso do usuário. Dê uma olhada na fonte de referência aqui

Também olhar para o [javadoc] [2] para AccessDecisionVoter. Você pode implementar suas regras, implementando o método vote.

int vote(Authentication authentication,
         Object object,
         ConfigAttributeDefinition config)

Let Primavera lidar com o acesso (autenticação e autorização). Se a tomada de decisão fica uso complicado um mecanismo de regras pode ser sábio. Deixe o método de voto chamar a um mecanismo de regras. Este fornecer separação clara do dever. Vamos Spring Security lidar com o acesso, e deixar que o mecanismo de regras calcular as regras.

[2]: http://static.springsource.org/spring-security/site/apidocs/org/springframework/security/vote/AccessDecisionVoter.html#vote (org.springframework.security.Authentication , java.lang.Object, org.springframework.security.ConfigAttributeDefinition)

Parece que você tem necessidades de autenticação e necessidades de autorização - muitas vezes as pessoas ficam os dois confusos e / ou unidas. Felizmente Spring Security delineia os dois muito bem. Você está utilizador irá autenticar através da cadeia de segurança (seja formar logj, openID, SSL X509) e, em seguida, uma vez feito com ser autorizada por seus eleitores específicos de negócios (em seus AccessDecisionManagers) a tempo ou não eles já têm visto o seu número atribuído de filmes. Se nova lógica de negócios precisa ser adicionado mais tarde é simplesmente uma questão de escrever novos mais eleitores / e injetá-los em seu Manager.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top