CakePHPプロジェクトのROOTディレクトリ(composer.jsonファイルがある場所)からcomposerでプラグインをインストールします。
Install the plugin with composer from your CakePHP Project’s ROOT directory (where the composer.json file is located)
php composer.phar require cakephp/authentication:^2.0
プロジェクトのsrc/Application.php
に次のステートメントを追加してプラグインをロードします:
Load the plugin by adding the following statement in your project’s src/Application.php
:
public function bootstrap(): void
{
parent::bootstrap();
$this->addPlugin('Authentication');
}
認証をミドルウェアに追加します。ミドルウェアに慣れていない場合の使用方法については、CakePHPのドキュメントを参照してください。
Add the authentication to the middleware. See the CakePHP documentation on how to use middleware if you are not familiar with it.
認証
アプリケーションフックを使用して認証ミドルウェアを構成する例:
Example of configuring the authentication middleware using authentication
application hook:
use Authentication\AuthenticationService;
use Authentication\AuthenticationServiceInterface;
use Authentication\AuthenticationServiceProviderInterface;
use Authentication\Middleware\AuthenticationMiddleware;
use Cake\Http\MiddlewareQueue;
use Psr\Http\Message\ServerRequestInterface;
class Application extends BaseApplication implements AuthenticationServiceProviderInterface
{
/**
* Returns a service provider instance.
*
* @param \Psr\Http\Message\ServerRequestInterface $request Request
* @return \Authentication\AuthenticationServiceInterface
*/
public function getAuthenticationService(ServerRequestInterface $request): AuthenticationServiceInterface
{
$service = new AuthenticationService();
$service->setConfig([
'unauthenticatedRedirect' => '/users/login',
'queryParam' => 'redirect',
]);
$fields = [
'username' => 'email',
'password' => 'password'
];
// Load the authenticators, you want session first
$service->loadAuthenticator('Authentication.Session');
$service->loadAuthenticator('Authentication.Form', [
'fields' => $fields,
'loginUrl' => '/users/login'
]);
// Load identifiers
$service->loadIdentifier('Authentication.Password', compact('fields'));
return $service;
}
/**
* Setup the middleware queue your application will use.
*
* @param \Cake\Http\MiddlewareQueue $middlewareQueue The middleware queue.
* @return \Cake\Http\MiddlewareQueue The updated middleware queue.
*/
public function middleware(MiddlewareQueue $middlewareQueue): MiddlewareQueue
{
// Various other middlewares for error handling, routing etc. added here.
// Create an authentication middleware object
$authentication = new AuthenticationMiddleware($this);
// Add the middleware to the middleware queue.
// Authentication should be added *after* RoutingMiddleware.
// So that subdirectory information and routes are loaded.
$middlewareQueue->add($authentication);
return $middlewareQueue;
}
}
構成されたオーセンティケーターの1つが資格情報を検証できた場合、ミドルウェアは認証サービスを要求オブジェクトにアトリビュートとして追加します。
If one of the configured authenticators was able to validate the credentials, the middleware will add the authentication service to the request object as an attribute.
次に、AppController
で認証コンポーネントをロードします:
Next, in your AppController
load the Authentication Component:
// in src/Controller/AppController.php
public function initialize()
{
parent::initialize();
$this->loadComponent('Authentication.Authentication');
}
デフォルトでは、コンポーネントはすべてのアクションに対して認証されたユーザーを必要とします。 特定のコントローラーでこの動作を無効にするには、allowUnauthenticated()
を使用します:
By default the component will require an authenticated user for all actions.
You can disable this behavior in specific controllers using
allowUnauthenticated()
:
// in a controller beforeFilter or initialize
// Make view and index not require a logged in user.
$this->Authentication->allowUnauthenticated(['view', 'index']);
ミドルウェアをアプリケーションに適用したら、ユーザーがログインする方法が必要になります。UsersController
の単純なログインアクションは次のようになります:
Once you have the middleware applied to your application you’ll need a way for
users to login. A simplistic login action in a UsersController
would look
like:
public function login()
{
$result = $this->Authentication->getResult();
// If the user is logged in send them away.
if ($result->isValid()) {
$target = $this->Authentication->getLoginRedirect() ?? '/home';
return $this->redirect($target);
}
if ($this->request->is('post') && !$result->isValid()) {
$this->Flash->error('Invalid username or password');
}
}
認証されていないユーザーがアクセスできるように、前のセクションで説明したように、コントローラーのbeforeFilter()
コールバックでログイン
アクションをホワイトリストに登録してください:
Make sure that you whitelist thelogin
action in your controller’sbeforeFilter()
callback as mentioned in the previous section, so that unauthenticated users are able to access it:
public function beforeFilter(\Cake\Event\EventInterface $event)
{
parent::beforeFilter($event);
$this->Authentication->allowUnauthenticated(['login']);
}
次に、単純なログアウトアクションを追加します:
and then add a simple logout action:
public function logout()
{
$this->Authentication->logout();
return $this->redirect(['controller' => 'Users', 'action' => 'login']);
}
ログインするために、ユーザーはハッシュ化されたパスワードを持っている必要があります。ユーザーがエンティティセッターメソッドを使用してパスワードを更新するときに、パスワードを自動的にハッシュできます:
In order to login your users will need to have hashed passwords. You can automatically hash passwords when users update their password using an entity setter method:
// in src/Model/Entity/User.php
use Authentication\PasswordHasher\DefaultPasswordHasher;
class User extends Entity
{
// ... other methods
// Automatically hash passwords when they are changed.
protected function _setPassword(string $password)
{
$hasher = new DefaultPasswordHasher();
return $hasher->hash($password);
}
}