O CakePHP Acesso Atribuição de Função específica de Acesso a Dados
-
28-10-2019 - |
Pergunta
Meu projeto de exigência é algo como isto:
No Topo, há-de ser Administrador, que terá todos os d o acesso, o primeiro nível de
Sob o Administrador, não serão Chefes de Departamento, que terá todos os d de acesso, além de Criar Chefes de Departamento
Sob Chefe de Departamento, haverá Outros Membros, que será a gestão de seus alocado o departamento de sábio de dados.
Agora, todos os diferentes chefes de departamento terão suas próprias informações e membros, e todos os chefes de departamento / Membros terão acesso aos seus próprios registros específicos, que eles estão entrando / gestão.
Agora, com o CakePHP do Componente ACL, eu posso dividir funções e o seu nível de acesso, mas todos os chefes de departamento pode ver o outro chefe de departamento de informação, como eles vão ter o mesmo nível de acesso, e Todos os Outros Membros podem ver os outros membros da informação na comparação de departamentos, como o de que terá o mesmo nível de acesso.
A minha complexidade do projeto é que eles devem ser visíveis apenas designado ou criado de informações / dados, embora tenham o mesmo nível / atribuições de função de outros.
Alguém pode me sugerir a melhor opção adequada, para gerenciar todas essas coisas já com plugins disponíveis com o CakePHP.
Eu posso trabalhar personalizando a ACL padrão do Componente, mas que vai demorar mais algum tempo, além do que é esperado.
Melhor as idéias e sugestões serão bem-vindos !
Solução
a minha maneira de ver, a ACL não é mágico.Por exemplo:ACL pode gerir as permissões de dizer quem tem acesso para adicionar/editar/remover um produto..mas ele não vai ser capaz de alterar uma consulta para filtrar os produtos de acordo com o definido permissões (como "usuários de Um departamento só pode ver produtos de departamento")..bem, na verdade isso é uma mentira, ACL pode gerenciar isso, mas pode não ser prático, porque cada vez que você adicionar um produto você tem que criar um ACO, e defina a permissão no AROS_ACOS tabela e desde AROS, é uma estrutura de árvore, então ele poderia facilmente tornar-se um nigthmare, se o seu planejamento para consulta de seus dados
Eu usaria um grupo só de ACL para controlar o acesso a determinadas páginas/ações e regras como:
- "O Chefe de departamento pode acessar a página 'lista de produtos' e adicionar/modificar/excluir produtos"
- "Os administradores podem acessar todas as páginas"
- "Outros usuários podem acessar 'lista de produtos' e eles podem adicionar produtos, mas não eliminá-los"
e eu gostaria de ajustar minhas consultas de acordo com o usuário conectado, então o controlador de "lista de produtos" da página, eu faria algo como:
- Se o usuário conectado blongs para o Chefe de Departamento, em seguida, selecione todos os produtos onde
product.department_id=connected_user.department_id
- Se o usuário conectado for Admin, em seguida, selecione todos os produtos
se você tiver muito consultas e você não quer fazer milhares de se frases, você pode criar um componente, de um comportamento ou talvez estender a find()
método na app_model
.A ideia é pegar todas as consultas e verifique se um dos modelos usados na consulta tem um campo chamado "department_id", se o fizerem, em seguida, adicione o model.department_id=connected_user.department_id
condição para a consulta.
Eu fiz isso por um site que pode ser visto em várias línguas e que cada língua tem a sua própria usuários, dados, registros, etc., e há um Administrador que pode ver todas as informações..e ele está funcionando muito bem para mim =)
Boa Sorte!
EDITADO: o comportamento que eu uso é:
<?php
class LocalizableBehavior extends ModelBehavior {
/**
* Filter query conditions with the correct `type' field condition.
*/
function beforeFind(&$model, $query)
{
/**
* Condition for the paginators that uses joins
*/
if(isset($query['joins']) && !empty($query['joins'])){
foreach($query['joins'] as $key => $joinTable){
if(ClassRegistry::init($joinTable['alias'])->hasField('lang')){
$query['joins'][$key]['conditions'][] = $joinTable['alias'].".lang = '".$_SESSION['lang']."'";
}
}
}
/**
* condition for the normal find queries
*/
if($model->hasField('lang') && $model->name != "User"){
$query['conditions'][$model->name.'.lang'] = $_SESSION['lang'];
}
return $query;
}
}
?>
é muito simples, eu alterar a consulta para adicionar uma condição para corresponder ao idioma atual ($_SESSION['lang']).No controlador de tudo o que eu preciso fazer é anexar a LocalizableBehavior e usar o método find, como de costume:
$this->Products->find('all');