Sistema de login

Alguem poderia postar aqui algum exemplo de como fazer um sistema de login, com varios nivel de usuario tipo, usuario, supervisor e administrador.

Fiz uma tabela de usuario com o login, senha e nivel. Entao como poderia estar fazendo isso.

Se alguem tiver algum exmplo poderia postar aqui para que eu possa estudar o codigo. Aguadeço demais.

Ao criares uma aplicação Yii com o Yiic, ele cria-te logo um sistema de login. Depois para adicionar gestão de permissões basta leres um pouco sobre o Authmanager, é bastante fácil de aplicar e usar: http://www.yiiframework.com/doc/guide/topics.auth

Na minha tabela Usuario de usuario tem os seguintes campos:

id

Nome

login

senha

tipo (1: usuario, 2: Supervisor, 3: administrador)

tema (aqui vai o thema jquery ui)

Blz mas a minha duvida é que eu nao estou conseguindo logar, qual a forma correta para mudar o codigo abaixo:


class UserIdentity extends CUserIdentity

{

    private $_id;

    public function authenticate()

    {

        $record=User::model()->findByAttributes(array('username'=>$this->username));

        if($record===null)

            $this->errorCode=self::ERROR_USERNAME_INVALID;

        else if($record->password!==md5($this->password))

            $this->errorCode=self::ERROR_PASSWORD_INVALID;

        else

        {

            $this->_id=$record->id;

            $this->setState('title', $record->title);

            $this->errorCode=self::ERROR_NONE;

        }

        return !$this->errorCode;

    }

 

    public function getId()

    {

        return $this->_id;

    }

}

O codigo acima pega o campo username e password, na minha tabela é login e senha. Sera que devo mudar? E quando for para validar atravez do email?

Como posso fazer para que depois de logado eu consiga conferir desta forma o tipo de usuario:

Yii::app()->user->isUsuario

Yii::app()->user->isSupervisor

Yii::app()->user->isAdministrador

Sei que ter aver com role management mas nao faço a minima ideia de como fazer, ja li a documentaccao mais nao tem nenhum exemplo, entao peço ajuda de vcs.

Espero que alguem possa me ajudar.

valew

Vamos por partes:

Primeiro o login.

Aparentemente está correto a parte do longin. Exibe algum erro de resposta quando loga???

E-mail de validação, vc tem que fazer no cadastro do usuário e não no login. Tipo, Vc cria um cadastro de usuários, e cria um campo booleano que não aparece no cadastro. Cria uma action em algum controller (Ou um controller específico pra isso, ai fica a seu caráter) para receber a autenticação por e-mail. Quanto vc enviar o e-mail, envia o link de confirmação para este controller/action que irá receber uma confirmação mais algum parâmetro para identificação do usuário. Aconselho vc a usar alguns dados do usuários com a função MD5 e colocar como parâmetro.

Quando receber a confirmação, e identificar de qual usuário ela se refere, vc coloca o campo booleano como verdadeiro, No login vc verifica além do usuário e senha, se este campo é verdadeiro.

Para pegar os valores depois de logado, vc pode seguir estes CookBooks:

http://www.yiiframework.com/doc/cookbook/80/

http://www.yiiframework.com/doc/cookbook/60/

Role Management é mais questão de permissões de acesso. Acho melhor vc primeiro resolver o problema do login. Até pq , independente do método que vc adote pra controlar as permissões, vc necessita fazer vc mesmo a parte de login (A não se que use alguma extensão)

Ahe galera estou com um pequeno problema.

Tipo o meu sistema que controla o site esta em uma pasta chamada protected/backend, ate ai blz, ahi eu fiz uma rota, que quando o usuario digita www.meusite.com.br/sisadm -> cai na pagina de login, onde te um (Logincontroller) e um layout proprio, que colocarei em baixo, quando o usuario faz o login é direcionadado para sisadm/home que o mesmo tem um (Homecontroller).

Tipo as minha duvida é o seguinte:

  • Quando o usuario seleciona o opcao para relembrar, e entra novamente no sistema cai na tela de login ele nao loga automaticamente.

  • Outra coisa se eu digito o endereço direto www.meusite.com.br/sisadm/home cai na pagina inicial do sistema como faço para se ele nao tiver logado mandar ele para pagina login. Verificar se ele esta logado(teria que fazer isso em todo os controller).

LoginForm.php


class LoginForm extends CFormModel

{

    public $username;

    public $password;

    public $rememberMe = false;

    private $_identity;


    /**

     * Declares the validation rules.

     * The rules state that username and password are required,

     * and password needs to be authenticated.

     */

    public function rules()

    {

        return array(

            // username and password are required

            array('username, password', 'required'),

            // rememberMe needs to be a boolean

            array('rememberMe', 'boolean'),

            // password needs to be authenticated

            array('password', 'authenticate', 'skipOnError'=>true),

        );

    }


    /**

     * Declares attribute labels.

     */

    public function attributeLabels()

    {

        return array(

            'rememberMe'=>'Remember me next time',

        );

    }


    /**

     * Authenticates the password.

     * This is the 'authenticate' validator as declared in rules().

     */

    public function authenticate($attribute,$params)

    {

        $this->_identity=new UserIdentity($this->username,$this->password);

        if(!$this->_identity->authenticate())

            $this->addError('password','Incorrect username or password.');

    }


    /**

     * Logs in the user using the given username and password in the model.

     * @return boolean whether login is successful

     */

    public function login()

    {

        if($this->_identity===null)

        {

            $this->_identity=new UserIdentity($this->username,$this->password);

            $this->_identity->authenticate();

        }

        if($this->_identity->errorCode===UserIdentity::ERROR_NONE)

        {

            $duration=$this->rememberMe ? 3600*24*30 : 0; // 30 days

            Yii::app()->user->login($this->_identity,$duration);

            return true;

        }

        else

            return false;

    }

}

UserItentity.php


class UserIdentity extends CUserIdentity

{

    private $_id;


    public function authenticate()

    {

        $username=strtolower($this->username);

        $user=Usuario::model()->find('LOWER(username)=?',array($username));

        if($user===null)

            $this->errorCode=self::ERROR_USERNAME_INVALID;

        else if($user->password!==md5($this->password))

            $this->errorCode=self::ERROR_PASSWORD_INVALID;

        else

        {

            $this->_id=$user->id;

            $this->username=$user->username;

            $this->errorCode=self::ERROR_NONE;

        }

        return $this->errorCode==self::ERROR_NONE;

    }


    public function getId()

    {

        return $this->_id;

    }

}

LoginController.php


class LoginController extends Controller

{

        public $layout='login';

        

    public function actionLogin()

    {

        $model=new LoginForm;

        if(isset($_POST['ajax']) && $_POST['ajax']==='login-form')

        {

            echo CActiveForm::validate($model);

            Yii::app()->end();

        }


    

        if(isset($_POST['LoginForm']))

        {

            $model->attributes=$_POST['LoginForm'];

                if($model->validate() && $model->login())

                $this->redirect('/sisadm/home');

        }

                       

        $this->render('login',array('model'=>$model));

    }


    

    public function actionLogout()

    {

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

        $this->redirect(Yii::app()->homeUrl);

    }

     




}

config.php


    'user'=>array(

                'allowAutoLogin'=>true,

                    'loginUrl'=>array('/sisadm/'),


            ),

Bom espero que me ajude na duvidas acima.

Valew

Essa opção de reelembrar eu ia usar, mais nen acabei usando, então não sei exatamente se ela nativamente do Yii funciona, como deve ser.

Sobre como saber se o usuário está logado ou não e muito fácil ‘Yii::app()->user->isGuest’ esse tipo de usuário e visitante.

Vai ter que definir o accessRules() para cada Controller, ou senão criar 1 accessRules() no components/Controller.php

Na documentação, tem um exemplo simples, com suas descrição, sobre Autenticação e Autorização.

http://www.yiiframework.com/doc/guide/pt/topics.auth

O que você vai ter que fazer, e liberar o login para todos os usuários, e no resto só para usuários logado.




class PostController extends CController

{

    ......

    public function accessRules()

    {

        return array(

            array('deny',

                'actions'=>array('create', 'edit'),

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

            ),

            array('allow',

                'actions'=>array('delete'),

                'roles'=>array('admin'),

            ),

            array('deny',

                'actions'=>array('delete'),

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

            ),

        );

    }

}



Valeu Newerton,

Consegui fazer a parada, agora a parada de relembrar funciona sim eu tentei, eu so coloquei no controle do login o codigo abaixo redirecionando para a tela principal.




if(!Yii::app()->user->isGuest){

                        $this->redirect('/sisadm/home');

                }



nao sei se é uma da formas mais correta, mais funcionou. Mas caso alguem tenha uma outra sugestão eu aceito.

Ahe pode usar o relembrar que funfa…sussuu…

Galera estou com uma pequena duvida, fiz o meu form de login sem o helper do yii e sem utilizar um model, eu tenho um controlles na minha aplicaçao com a action que pegara as informaçoes deste form.

Com eu posso esta fazendo um validaçao sem utilizar o UserIdentity pois eu utilizo ele para validar o login do backend e este login esta no frontend e este form se encontra em todas as paginas do site. Entao a minha ideia era fazer esta validaçao neste controller sem utilizar esta classe pois esta validaçao é pelo e-mail do usuario.

Alguem poderia me ajudar como eu posso esta fazendo isso de uma forma bem simples. Pois é so validar com o banco abri uma sessao com id e nome.

Valew brows

[color="#696969"]"nao sei se é uma da formas mais correta, mais funcionou. Mas caso alguem tenha uma outra sugestão eu aceito."[/color]

Eu acho que a melhro abordagem é usar o accessRules como o Newerton falou. Facilita bastânte a manutenção do sistemas e mudanças de permissões quando a parada ficar grande. :)

[color="#696969"]"Com eu posso esta fazendo um validaçao sem utilizar o UserIdentity pois eu utilizo ele para validar o login do backend e este login esta no frontend e este form se encontra em todas as paginas do site. Entao a minha ideia era fazer esta validaçao neste controller sem utilizar esta classe pois esta validaçao é pelo e-mail do usuario."[/color]

Pq vc não cria um segundo UserIdentity pro front-end?

Para usar 2 Identify diferente, tive um problema, mais foi resolvido, até discutimos aqui no forum.

http://www.yiiframework.com/forum/index.php?/topic/11051-resolvido-2-dois-login-independente/

Veja se te ajuda.

Verdade, já tinha esqueçido :)

Estou com duvida no seguinte, eu tenho que trabalhar com dois CUserIdentity um pro frontend e outro pro Backend eu tenho um controller no frontend que é destinada a area do usuario do site, eu teria que criar um action neste controller para validar o usuario no CUserIdentity no frontend.

Eu separo a minha aplicaçao assim

http://www.yiiframework.com/wiki/33/

Vi que é so adicionar estas linhas de comando abaixo, mais poderia me explicar o comando e onde eu deve inserir.

Resumindo poderia me esclarecer qual a forma que devo seguir tipo um tutorial basico.

Valew


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);

Edson,

Esse Yii::app()->user->setStateKeyPrefix(’_admin’);

Tu vai adicionar em components/Controller.php de cada Aplicação sua!

Se tu separo por módulo, cada módulo tem seu components/

Se a function init() não estiver criada tu cria, e adiciona o Yii::app()->user->setStateKeyPrefix(’_admin’);

dentro dessa função.

E tem que coloca o logout como false, para ele limpar só aquela sessão do aplicativo que foi deslogado.

ola sou novo no mundo da programação, estava tentando fazer um blog com o yii framework até a antes da parte de autenticação deu tudo certo mas não sei por que cargas daqua não consigo fazer o yii reconhecer a senha e o usuario no banco de dados do mysql. eu copiei o código certinho da autenticação, mas não funciona, gostaria de saber se alguem pode me ajudar?

parei nessa parte o código esta identico ao do site até ai…

www.yiiframework.com/doc/blog/1.1/en/prototype.auth

obrigado

tente detalhar um pouco mais a sua dúvida, postar mensagens de erro, e etc … assim fica meio difícil ajudar.

Então, você criou a tabela com os mesmos campos usado pela class User ? caso contrário vai ter que substituir nos arquivos os nome das variaveis.

da esse erro quando eu atualizo o código do UserIdentity

e esse é o código que atualizei o UserIdentity:

obrigado!!

existe a classe User? Está na pasta models?

sim existe:

esse é o código…tentei trocar um monte de coisas mas não funfa…

Pois então, vc ta instanciando a classe User, mas o nome da sua classe, é Users (No plural)