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 !

Foi útil?

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');
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top