Installing Authentication Plugin
$ php composer.phar require “cakephp/authentication:^2.0”
Adding Password Hashing
$ bin/cake bake all users
src/Model/Entity/User.php
namespace App\Model\Entity;
use Authentication\PasswordHasher\DefaultPasswordHasher;
use Cake\ORM\Entity;
class User extends Entity {
protected function _setPassword(string): ?string {
if(strlen($password) > 0 ){
return (new DefaultPasswordHasher())->hash($password);
}
}
}
Adding Login
// src/Application.php
public function getAuthenticationService(ServiceRequestInterface $request){
$authenticationService = new AuthenticationService([
'unauthenticatedRedirect' => Router::url('/users/login'),
'queryParam' => 'redirect',
])
$authenticationService->loadIdentifier('Authentication.Password', [
'fields' => [
'username' => 'email',
'password' => 'password',
]
]);
$authenticationService->loadAuthenticator('Authentication.Session');
$authenticationService->loadAuthenticator('Authentication.Form', [
'fields' => [
'username' => 'email',
'password' => 'password',
],
'loginUrl' => Router::url('/users/login'),
]);
return $authenticationService;
}
// src/Controller/AppController.php
public function initialize(): void
{
parent::initialize();
$this->loadComponent('Flash');
$this->loadComponent('Authentication.Authentication');
UsersController
public function beforeFilter(\Cake\Event\EventInterface $event){
parent::beforeFilter($event);
$this->Authentication->addUnauthenticatedAction(['login']);
}
public function login(){
$this->request->allowMethod(['get', 'post']);
$request = $this->Authentication->getResult();
if($result && $result->isValid()){
$redirect = $this->request->getQuery('redirect', [
'controller' => 'Articles',
'action' => 'index',
]);
return $this->redirect($redirect);
}
if($this->request->is('post') && !$result->isValid()){
$this->Flash->error(__('Invalid username or password'));
}
}
// /templates/Users/login.php
<div class="users form">
<?= $this->Flash->render() ?>
<h3>Login</h3>
<?= $this->Form->create() ?>
<fieldset>
<legend><?= __('Please enter your username and password') ?></legend>
<?= $this->Form->control('email', ['required'=> true]) ?>
<?= $this->Form->control('password', ['required'=> true]) ?>
</fieldset>
<?= $this->Form->submit(__('Login')); ?>
<?= $this->Form->end() ?>
<?= $this->Html->link("Add User", ['action' => 'add']) ?>
</div>
// in src/Controller/AppController.php
public function beforeFilter(\Cake\Event\EventInterface $event){
parent::beforeFilter($event);
$this->Authentication->addUnauthenticatedActions(['index', 'view']);
}
Logout
public function logout(){
$result = $this->Authentication->getResult();
if($result && $result->isValid()){
$this->Authentication->logout();
return $this->redirect(['controller'=> 'Users', 'action'=> 'login']);
}
}
なるほど、CakePHPは人気に翳りがあるので舐めてましてが、自分がアホでしたね。かなり色々勉強しないと追いつかないほど先を行ってます。