[RESOLVIDO] 2 (dois) Login independente

Olá a todos,

Andei pesquisando no fórum, e não encontrei nada concreto para que seja viável o funcionamento de 2 login distinto.

No Módulo “admin”, está funcionando corretamente, desenvolvi um próprio ‘RBAC’ básico, com controle de “controller” e “action” SÓ, pois to tendo dificuldade de separar o login do “site” com o módulo “admin”.

Vou desenvolver um site de orçamento online, e não queria usar 1 tabela de ‘usuário’ para cadastrar ‘cliente’ e/ou ‘administradores’, quero fazer uma coisa organizada.

Alguem tem alguma sugestão, para que eu consiga usar 2 componente de autenticação?

Att.,

Newerton Vargas de Araújo

Obs.: Alterei o título para fácil busca no fórum e nos buscadores externo.

Fiz algo parecido, porem identifiquei no usuario o tipo, se for admin redireciona para o ambiente administrativo, se for site, redireciona para o site.

Na hora da autenticação faz um teste e verifica qual tipo ele é e redireciona para seu ambiente.

Railton

Então Railton,

No módulo /admin/ ta tudo funcionando, o problema que ocorre e o seguinte.

Tenho o /site/ e o /admin/, o /site e o padrão do Yii, so que o /admin/ é meu módulo.

Quando eu logo no /admin ele funciona normal, quando eu vou para o /site naquele menu padrão do Yii, no menu ao invés de [Login] está [Logout (newerton)].

O próprio sistema usa 1 componente so, o ‘user’, isso acontece se eu fizer ao contrário.

Se eu logar no /site como user: admin, password:admin, quando acesso o /admin, da erro de senha.

Queria poder usar dois “CUserIdentity” diferente, mais o ‘components->user’ não dá. :(

Vou postar umas print, do problema que ocorre.

Login da administração.

Logado na administração do site.

Depois de logado na administração, fica o logout no site :(

Pergunta, são duas apps separadas???? Ou são 2 modulos da mesma app??

Daniel,

É 1 modulo na mesma app, eu identifiquei o /site como exemplo só, mais existe 1 modulo so, o modules/admin.

Esse módulo ta normal, so que o ‘Yii:app()->user’ e usado para ambos, tanto para o modulo para o /site.

Eu não queria usar session ou cookie para autenticar o usuário no /site, mais até agora não achei solução para isso.

Vou explicar meio por cima um sistema que vou fazer:

Será cadastrado no Painel de Administração:

  • Representantes

  • Clientes

  • Produtos

  • Pedidos

Eu não quero usar 1 tabela, e definir permissão, quero deixar organizado o banco de dados, tipo: usuario, cliente, representante e assim sucessivamente.

Já procurei no forum e alguns dizem pra usar 1 tabela, e acrescentar o user_type, não acho correto isso.

Particularmente eu uso uma tabela pra usuários, separada dos outros dados, apenas com usuário, senha e perfil, mas ai é questão de gosto e não vou entrar neste mérito, e o seu problema parece não ser pegar da tabela certa, então vamos deixar isso pra lá…

Bom, respondendo a sua pergunta no começo, de usar 2 UserIdentity, vc pode fazer uma condicional e instanciar o UserIdentity que vc quer usar dentro do model LoginForm, no método "authenticate()".Pensei em fazer isso aqui, pois num projeto que desenvolvo, poderia se logar com LDAP ou usuário cadastrado no banco, dependendo das configs. Não é a mesma coisa que vc quer, mas, acho que a solução é a mesma. Acabou que fiz por outra solução e ficou só na idéia mesmo.

Quanto a login sem cookie, até dá … mas vc vai ter que colocar na URL de todas as requisições do sistema com o identificador como parâmetro o que vai te gerar uma URL grande nada amigável ao usuário, além ser muito propenso a erros (Caso vc esqueça de adicionar o identificador em algum lugar, o seu sistema quebra)

Newerton

Usuario do site irá acessar o admin normalmente ?

ou o usuario do site nem saberá do admin ?

se for assim nao precisa você se preucupar.

Onde se faz logout cria uma regra, que alem de estar logado o usuario necessita ser usuario do grupo site para valer no menu do site.

Daniel,

Então eu queria pode deixar em uma tabela, mais a questão é que os dados da tabela usuario, tem dados que não há nescessidade de um representante ter.

"…Quanto a login sem cookie, até dá …". Sem cookie não, com cookie.

Estava pensando em usar session ou cookie.

Isso Railton,

O usuário do site, não tem acesso ao admin.

Tem alguma regra no ‘accessRules()’ para que eu possa limita acesso aos modulos? Achei alguma coisa no forum, mais perdi a referencia.

Bom, vou postar aqui as tabelas que uso, e o erro que ocorre, assim fica mais fácil, vocês saberem o que ocorre.

Vamos la.

table ‘usuario’




(

  `codusuario` int(<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' /> NOT NULL auto_increment,

  `codusuariocargo` int(<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' /> NOT NULL,

  `nome` varchar(60) NOT NULL,

  `sobrenome` varchar(120) NOT NULL,

  `usuario` varchar(120) NOT NULL,

  `senha` varchar(40) NOT NULL,

  `email` varchar(120) NOT NULL,

  `liberar` int(1) NOT NULL,

  `datacriacao` datetime NOT NULL,

  `acesso` datetime NOT NULL,

  `ultimoacesso` datetime NOT NULL,

  `contaracesso` int(11) NOT NULL,

  `acessonicio` time NOT NULL,

  `acessofim` time NOT NULL,

  `ativarsenha` int(1) NOT NULL,

  `codtema` int(<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' /> NOT NULL,

  PRIMARY KEY  (`codusuario`)

);



table ‘usuariocargo’




`usuariocargo` (

  `codusuariocargo` int(<img src='http://www.yiiframework.com/forum/public/style_emoticons/default/cool.gif' class='bbc_emoticon' alt='8)' /> NOT NULL,

  `titulo` varchar(120) NOT NULL,

  `permissao` text NOT NULL,

  PRIMARY KEY  (`codusuariocargo`)

)



Essa tabela ‘usuariocargo’, e onde eu seto as permissões das controllers e actions, vou mostrar o print da tela no admin.

Após criar os cargo dos usuários, eu vou na página de usuário, e seto o cargo do usuário.

Essa tela mostra o erro que dá, quando um representante autentica no site, e tenta acessar o admin.

Meu ‘accessRules()’ do componentes/Controller.php




public function accessRules() {


        $aRules = array();


        if( isset(Yii::app()->user->codusuario) && Yii::app()->user->codusuario <> '') {


            $cod = Usuario::model()->find('codusuario = ?', Yii::app()->user->getId());


            if($cod->codusuariocargo <> 1) {


                $group = UsuarioCargo::model()->find('codusuariocargo = ?', $cod->codusuariocargo);

                $permissao = json_decode('['.$group->permissao.']');


                foreach($permissao as $key => $value) {


                    $controllers = explode(',', $value->controllers);

                    if($value->controllers == '') {

                        $controllers = array('');

                    }


                    $actions = explode(',', $value->actions);

                    if($value->actions == '') {

                        $actions = array('index', 'view', 'create', 'update', 'delete', 'admin');

                    }


                    $rule = array('allow',

                            'controllers' => $controllers,

                            'actions' => $actions,

                            'users' => array(Yii::app()->user->usuario)

                    );


                    array_push($aRules, $rule);


                }


            } else {


                array_push($aRules,

                        array('allow',  // allow all users to perform 'index' and 'view' actions

                        'users'=>array(Yii::app()->user->usuario),

                        )

                );


            }

        }


        array_push($aRules,

                array('allow',  // allow all users to perform 'index' and 'view' actions

                'actions'=>array('login', 'logout'),

                'users'=>array('*'),

                ),

                array('deny',

                'users'=>array('*'),

                )

        );


        return $aRules;

    }



Eu gostaria de separar as autenticação do módulo admin, por que quando eu logo na administração com o usuário ‘newerton’, no fron-end, aparece como ‘newerton’ logado, não quero isso, no site só vai logar os representantes, não quero o usuário da administração logado no front-end, e assim vice e versa.

Agradeço a coomprensão de todos.

Olá a todos,

Depois de uma boa durmida, a mente descansa bem para o trabalho.

Achei a solução dos meu problemas, espero que ajuda futuramente a todos.

A solução seria adicionar ao Controller do meu modulo a seguinte linha.




public function init()

{

   Yii::app()->user->setStateKeyPrefix('_admin');

}



Caso seu Controller já tenha o init(), so adicionar:


Yii::app()->user->setStateKeyPrefix('_admin');

E tem mais outro detalhe, no logout() da sua app,

mudar de:


Yii::app()->user->logout();

para:


Yii::app()->user->logout(false);

Agora eu consigo logar no Front-end, sem afetar o Back-end, o erro que postei na imagem não ocorre mais, e assim vice-versa, quando eu logo no Back-end, não afeta mais no Front-end.

Isso pode servir para quem deseja desenvolver um e-commerce, por que a tabela ‘customers’ e separado de ‘users’.

Abraços.

Obs.:

Referência: http://www.yiiframework.com/forum/index.php?/topic/7323-how-to-differentiate-frontend-user-and-web-administrators/

Interessante.

ele cria as sessões para o backend com nome diferentes do frontend.

Gostei da solução.

vou implementar no meu modulo administrativo isso tbm.

[]s

Pow … achei uma solução parecida aqui, mas seria mudar o nome do cookie de cada uma :)

no final, mudando o prefixo fica uma solução mais legal, pq vc pode definir um nome base…

O bom disso também, que não tem conflitos de attributos.

O Yii::app()->user, é diferente tanto no /site quanto no /admin.

Bom para separar vários logins para cada módulo.

Bom para e-commerce.

Newerton , diz uma coisa , realizaste backend com directorias ou seja www.teste.com/admin/index.php

o teu index.php vai ser login page, depois de realizar o login reedirecciona para administração do site

Até aqui tudo bem !?? agora surge estas dúvidas !!! que mt gente já as colocou aqui !!!

1- O backend vai ter página login , como faço relativamente layout ??? se faço layout para página login e o resto das páginas de admin

2- Crio modulo admin ???

3- Crio layout geral para o admin e crio uma view mais especifica ???

Estou completamente baralhado .

Tiagoc,

Vamos lá com suas dúvidas:

1- O backend vai ter página login , como faço relativamente layout ??? se faço layout para página login e o resto das páginas de admin.

Procura no seu Controller qual o action que direciona para o login e adiciona a seguinte linha dentro do action:


$this->layout = 'login';

Ai você vai em layouts/ e cria o login.php

2- Crio modulo admin ???

Tenta usar o gii, abre sua aplicação, e adiciona localhost/seuprojeto/gii/, que vai ser direcionado a um sistema de geração de crud, modulos e por ae vai.

3- Crio layout geral para o admin e crio uma view mais especifica ???

Depois que você criar o modulo, poderár fazer um layout separado da aplicação front-end.

Referência: http://www.yiiframework.com/doc/guide/1.1/en/topics.auth

Olá Newerton,

Terei que fazer um controle de permissão muito parecido com este que você citou, onde o usuário será relacionado com um cargo e os cargos com as permissões no sistema.

Você desenvolveu do zero ou utilizou alguma extensão?, enfim, tem algum código não proprietário que poderia passar de exemplo?

Obrigado.