クイックスタート

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 the login action in your controller’s beforeFilter() 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);
    }
}