E ai galera, tudo BELÊ? Depois de aprendermos como trabalhar com identidades no yii2, nessa parte 2, iremos testar em um formulário tudo o que foi feito na parte I. AH, aproveitando a deixa: se você ainda não viu a parte I desse tutorial, clique no link abaixo e vejo como criamos nossa autenticação:
Autenticação no Yii2 – Parte I
Formulário de Login
Na Classe yii\web\User, que foi registrado no nosso web.php, existe um atributo chamado loginUrl, que representa a url para a página de Login da aplicação (Acho que o nome já diz isso –‘).
Por padrão, o valor deste atributo é: [‘site/login’]. Vamos modificar a URL da tela de login para site/meuLogin, dessa forma
'components' => [ ... 'user' => [ 'identityClass' => 'app\models\User', 'loginUrl' => ['site/meuLogin'], 'enableAutoLogin' => true // Necessario p/ login baseado em cookies ], ... ]
Vamos utilizar o mesmo formulário que é usado no template basic modificando algumas coisas. Primeiramente, vamos a Classe: app\models\LoginForm
<?php namespace app\models; use Yii; use yii\base\Model; /** * LoginForm is the model behind the login form. */ class LoginForm extends Model { public $email; public $password; public $rememberMe = true; private $_user = false; /** * @return array the validation rules. */ public function rules() { return [ [['email', 'password'], 'required'], ['email', 'email'], ['rememberMe', 'boolean'], ['password', 'validatePassword'], ]; } /** * Validates the password. * This method serves as the inline validation for password. * * @param string $attribute the attribute currently being validated * @param array $params the additional name-value pairs given in the rule */ public function validatePassword($attribute, $params) { if (!$this->hasErrors()) { $user = $this->getUser(); if (!$user || !$user->validatePassword($this->password)) { $this->addError($attribute, 'Incorrect username or password.'); } } } /** * Logs in a user using the provided username and password. * @return boolean whether the user is logged in successfully */ public function login() { if ($this->validate()) { return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600*24*30 : 0); } return false; } /** * Finds user by [[username]] * * @return User|null */ public function getUser() { if ($this->_user === false) $this->_user = User::findOne(['email' => $this->email]); return $this->_user; } }
Essa classe está apenas dizendo que o nosso formulário:
- Yii::$app->user retorna a instância do component yii\web\User;
- Terão os campos: email, password e rememberMe;
- É configurado as regras (rules) básica de validação para cada campo;
- Criação do método getUser(), para que possamos consultar na nossa tabela se o usuário realmente existe;
- É criado o método login(), que será o responsável pela criação da identidade. Observe que o 2º parâmetro desse método é uma expressão numérica 3600*24*30 que representa, em segundos, o tempo de vida do cookie que é criado caso você marque o checkbox rememberMe.
Caso você não conheça os Core Validators no Yii2, clique aqui e veja quais são e como os mesmos funcionam!
Controlador
Depois de criado o formulário, vamos configurar nosso controlador SiteController, criando uma nova action chamada: actionMeuLogin
class SiteController extends Controller { ... public function behaviors() { return [ 'access' => [ 'class' => AccessControl::className(), 'only' => ['logout'], 'rules' => [ [ 'actions' => ['logout'], 'allow' => true, 'roles' => ['@'], ], ], ] ]; } public function actionMeuLogin() { if (!\Yii::$app->user->isGuest) return $this->goHome(); $model = new LoginForm(); if ($model->load(Yii::$app->request->post()) && $model->login()) return $this->goBack(); return $this->render('meuLogin', [ 'model' => $model, ]); } ... }
No controlador não tem muito segredo, estamos apenas dizendo:
- Foi registrado um Filtro AccessControl (dentro do método behaviors) dizendo que só vai permitir acessar a action logout para usuários autenticados;
- Caso o usuário não seja convidado, ou esteja autenticado, (!\Yii::$app->user->isGuest), redirecionamos o usuário para a página inicial;
- Caso usuário tenha submetido o formulário, a aplicação vai “popular” o objeto LoginForm e tentar fazer a autenticação com o método $model->login();
- Instanciamos nosso formulário e enviamos sua instância para a view meuLogin;
Caso você queira ver mais detalhes sobre Filters, assista essa vídeo aula onde falo exclusivamente sobre esse assunto!
View
Depois de criado nossa Classe de Formulário e a Action, vamos criar a view site/meuLogin.php para que o usuário possa entrar com suas credenciais. Esta view é muito semelhante ao formulário de login que ja vem no Basic Template:
<?php /* @var $this yii\web\View */ /* @var $form yii\bootstrap\ActiveForm */ /* @var $model app\models\LoginForm */ use yii\helpers\Html; use yii\bootstrap\ActiveForm; $this->title = 'Login'; $this->params['breadcrumbs'][] = $this->title; ?> <div class="site-login"> <p>Please fill out the following fields to login:</p> <?php $form = ActiveForm::begin([ 'id' => 'login-form', 'options' => ['class' => 'form-horizontal'], 'fieldConfig' => [ 'template' => "{label}\n<div class=\"col-lg-3\">{input}</div>\n<div class=\"col-lg-8\">{error}</div>", 'labelOptions' => ['class' => 'col-lg-1 control-label'], ], ]); ?> <?= $form->field($model, 'email') ?> <?= $form->field($model, 'password')->passwordInput() ?> <?= $form->field($model, 'rememberMe')->checkbox([ 'template' => "<div class=\"col-lg-offset-1 col-lg-3\">{input} {label}</div>\n<div class=\"col-lg-8\">{error}</div>", ]) ?> <div class="form-group"> <div class="col-lg-offset-1 col-lg-11"> <?= Html::submitButton('Login', ['class' => 'btn btn-primary', 'name' => 'login-button']) ?> </div> </div> <?php ActiveForm::end(); ?> </div>
Você terá algo parecido com isso:
Caso você queria ver mais detalhes deste fantástico Widget ActiveForm, clique aqui !
Se você tiver feito tudo direitinho, sua autenticação já deve está 100% funcionando! Note que no Basic Template, quando estamos autenticado, o item de menu Login “transforma-se”em Logout (username), como na imagem abaixo:
Espero que tenha gostados desses 2 artigos falando de Autenticação no Yii2.
Um forte Abraço e até a próxima!
Mais uma vez os artigos ajudando e esclarecendo certas dúvidas que nem sempre a documentação deixa clara.
Valeu Cálcio, agradeço pelo seu feedback!
Ola Kilderson
Parabéns pelo brilhante trabalho no esclarecimento e aulas do YII2, estou aprendendo muito.
Sou iniciante nesse assunto, inclusive já respondi a sua pesquisa sobre o assunto.
Na empresa em que trabalho, tem um grupo de pessoas com a intenção de inserir o Yii2> Eu também comprei este briga, mas sou iniciante.
Minha primeira incumbência é de fazer o nosso Yii2 fazer Autenticação já usando “chave de rede Windows” da rede Network com Active Director.. Pois todos da empresa já possuem chave de rede..
Você poderia me dar uma dica, para eu tentar fazer esse logon usando a chave de rede ?
Sei que não vai ser fácil com as minhas limitações de programação, mas garanto que vou tentar.
Grato
Djalma – 09/06/16
Primeiramente, muito obrigado pelo seu retorno e pelos elogios ao nosso material. o PHP em si, já tem suporte a LDAP, que é o que você está precisando. O Yii Framework tem alguns módulos já prontos para isso, vai aqui um exemplo:
https://github.com/edvler/yii2-adldap-module
E aqui, tem um simples tutorial ensinando implementar:
http://des1roer.blogspot.com.br/2015/07/yii-2-ad-ldap.html
Espero ter ajudado amigo, e conto contigo nos próximos vídeos.
Grande Kilderson Sena
Me de uma ideia de como eu posso por todo esse SQL puro no Yii2,
e ter uma View com os campos:
Registro do empregado;
Nome do empregado;
Iniciativas;
Competências à adquirir
Comando SQL:
SELECT p.registro, p.nome Empregado, pe.nome Iniciativa, pca.competencia_nome
FROM pdi_projeto_estruturante ppe
inner join pdi on pdi.id = ppe.pdi_id
inner join projeto_estruturante pe on pe.id = ppe.projeto_estruturante_id
inner join pessoa p on p.registro = pdi.registro
inner join pdi_competencia_adquirir pca on pca.pdi_id = ppe.pdi_id
where pdi.ciclo_pdi_nome = ‘2016’
limit 5000000
Grato
Djalma – 01/07/16
Olá Djalma! O que você está querendo é fazer um Custom Query. Para tal, basta seguir esse guia da documentação oficial do Yii2 que você verá como fazer:
http://www.yiiframework.com/doc-2.0/guide-db-active-record.html
Otimo todo seu esclarecimento.
Teria jeito que criar um post mostrando como criar uma ação para salvar no banco a senha criptografa e como reseta a senha conforme mostra a documentação?
Assim ficar completo.
Obrigado
Olá! Primeiramente, muito obrigado pelo seu feedback amigo! Já está anotado a sua sugestão de vídeo! Assim que possível, iremos produzi-lo. Forte abraço!