+2

Authentication trong Laravel 5.3 P2

Xin chào các bạn. Hôm nay mình sẽ tiếp tục giới thiệu về Authentication trong Laravel 5.3 cho các bạn.

Ở bài trước mình đã giới thiệu tổng quát về Authentication cũng như cách tạo một Authentication cơ bản. Bài viết này mình sẽ đi sâu hơn vào Authentication và sẽ giới thiệu những phần còn lại của Authentication trong Laravel 5.3 cho các bạn. 4. HTTP Basic Authentication HTTP Basic Authentication cung cấp một cách nhanh chóng để xác thực người dùng của ứng dụng của bạn mà không cần phải thiết lập một trang "login" tách biệt. Để bắt đầu, đính kèm auth.basic middleware vào route của bạn. Middleware auth.basic được bao gồm trong Laravel framework, vì vậy bạn không cần phải định nghĩa nó:

<?php

Route::get('profile', ['middleware' => 'auth.basic', function() {
    // Only authenticated users may enter...
}]);

Một khi middleware đã được đính kèm vào route, bạn sẽ tự động được nhắc nhở về các thông tin khi truy cập vào route trên trình duyệt. Mặc định, middleware auth.basic sẽ dùng cột email trên các bản ghi user như là "username". Một lưu ý về FastCGI Nếu bạn đang sử dụng PHP FastCGI, HTTP Basic authentication có thể không hoạt động chính xác. Những dòng sau nên được thêm vào trong file .htaccess của bạn:

<?php

RewriteCond %{HTTP:Authorization} ^(.+)$
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

Stateless HTTP Basic Authentication Bạn cũng có thể sử dụng HTTP Basic Authentication mà không cần thiết lập một cookie định danh người dùng trong session, cái mà là một thành phần hữu ích cho API authentication. Việc tiếp theo, Định nghĩa một middleware cái mà gọi phương thức onceBasic. Nếu không có response nào được trả về bởi phương thức onceBasic, request có thể được chuyển vào trong ứng dụng:

<?php
namespace Illuminate\Auth\Middleware;

use Auth;
use Closure;

class AuthenticateOnceWithBasicAuth
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        return Auth::onceBasic() ?: $next($request);
    }

}

Tiếp theo Đăng kí route middleware và đính kèm nó vào một route:

<?php

Route::get('api/user', ['middleware' => 'auth.basic.once', function() {
    // Only authenticated users may enter...
}]);

5.Reset Mật Khẩu Những chú ý về database

Hầu hết các ứng dụng web cung cấp một cách cho người dùng thiết lập lại mật khẩu đã quên của mình. Hơn là việc tập trung bạn phải re-implement điều này trên mỗi ứng dụng, Laravel cung cấp các phương thức thuận tiện cho việc gửi các nhắc nhở về mật khẩu và thực hiện thiết lập lại nó.

Để bắt đầu, đảm bảo model App\User của bạn implement Illuminate\Contracts\Auth\CanResetPassword contract. Tất nhiên, model App\User có sẵn trong framework đã implement interface này rồi, và sử dụng Illuminate\Auth\Passwords\CanResetPassword trait để include những phương thức cần thiết để implement interface. Tạo Reset Token Table Migration Tiếp theo, một table phải được tạo để lưu các token password reset. Migration cho table này đã được tích hợp sẵn trong Laravel out of the box, và ở trong thư mục database/migrations. Vì vậy toàn bộ việc bạn cần là thực hiện migrate:

php artisan migrate

Routing

Laravel bao gồm một Auth\PasswordController có các logic cần thiết để thiết lập lại mật khẩu của user. Toàn bộ các route cần thiết để thực hiện reset password có thể được sinh ra bằng cách sử dụng Artisan command make:auth:

php artisan make:auth

Views Một lần nữa, Laravel sẽ sinh toàn bộ các view cần thiết cho việc reset password khi command make:auth được thực thi. Những view này đặt tại resources/views/auth/passwords. Bạn hoàn toàn có thể tùy biến chúng nếu thấy cần thiết cho ứng dụng của mình. Sau khi Reset Password Một khi bạn đã có các route và view để thiết lập lại password của user, bạn có thể đơn giản truy cập route trong trình duyệt tại /password/reset. PasswordController trong framework đã bao gồm toàn bộ logic để gửi email link reset password cũng như cập nhật password trong database.

Sau khi password được reset, user sẽ tự động được đăng nhập vào ứng dụng và chuyển hướng tới /home. Bạn có thể tùy biến lại địa chỉ chuyển hướng của post reset passwrod bằng cách định nghĩa một thuộc tính redirectTo trong PasswordController:

protected $redirectTo = '/dashboard';

Tùy biến Tùy biến Authentication Guard Trong file cấu hình auth.php, bạn có thể cấu hình nhiều "guards", cái mà có thể được dùng để định nghĩa việc xác thực cho nhiều bảng user. Bạn có thể tùy biến PasswordController để dùng guard bạn chọn bằng cách thêm thuộc tính $guard vào controller:

/**
 * The authentication guard that should be used.
 *
 * @var string
 */
protected $guard = 'admins';

Tùy biến Password Broker

Trong file cấu hình auth.php, bạn có thể cấu hình nhiều password "broker", cái mà có thể được sử dụng để reset password cho nhiều table user. Bạn có thể tùy biến PasswordController để sử dụng broker bạn chọn bằng cách thêm thuộc tính $broker vào controller:

/**
 * The password broker that should be used.
 *
 * @var string
 */
protected $broker = 'admins';

6.Thêm các Custom Guards Bạn có thể định nghĩa các authentication guard của bạn bằng cách sử dụng phương thức extend trên facade Auth. Bạn nên đặt lời gọi này tới provider cùng với một service provider:

<?php

namespace App\Providers;

use Auth;
use App\Services\Auth\JwtGuard;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Perform post-registration booting of services.
     *
     * @return void
     */
    public function boot()
    {
        Auth::extend('jwt', function($app, $name, array $config) {
            // Return an instance of Illuminate\Contracts\Auth\Guard...

            return new JwtGuard(Auth::createUserProvider($config['provider']));
        });
    }

    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Như bạn có thể thấy trong ví dụ trên, callback được truyền vào phương thức extend trả về một implementation của Illuminate\Contracts\Auth\Guard. Interface này bao gồm vài phương thức bạn sẽ cần để implement để định nghĩa một custom guard.

Một khi custom guard của bạn được định nghĩa, bạn có thể sử dụng guard trong cấu hình guards:

'guards' => [
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],

7.Thêm các Custom User Provider Nếu bạn đang không sử dụng các cơ sở dữ liệu quan hệ truyền thống để lưu trữ user, bạn sẽ cần phải mở rộng Laravel với authentication user provider của bạn. Chúng ta sẽ dùng phương thức provider trên facade Auth để định nghĩa một custom user provider. Bạn cần đặt lời gọi tới provider trong một service provider:

<?php

namespace App\Providers;

use Auth;
use App\Extensions\RiakUserProvider;
use Illuminate\Support\ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Perform post-registration booting of services.
     *
     * @return void
     */
    public function boot()
    {
        Auth::provider('riak', function($app, array $config) {
            // Return an instance of Illuminate\Contracts\Auth\UserProvider...
            return new RiakUserProvider($app['riak.connection']);
        });
    }

    /**
     * Register bindings in the container.
     *
     * @return void
     */
    public function register()
    {
        //
    }
}

Sau khi bạn đã đăng kí provider với phương thức provider, bạn có thể chuyển sang user provider mới trong file cấu hình config/auth.php. Đầu tiên, định nghĩa một provider mà sử dụng driver mới của bạn:

'providers' => [
    'users' => [
        'driver' => 'riak',
    ],
],

Sau đó bạn có thể sử dụng provider này trong cấu hình guards:

'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],
],

8.Events Laravel xây dựng một loạt events khác nhau trong khi xử lí xác thực. Bạn có thể đính kèm các listener vào những event này trong EventServiceProvider của bạn:

/**
 * The event listener mappings for the application.
 *
 * @var array
 */
protected $listen = [
    'Illuminate\Auth\Events\Attempting' => [
        'App\Listeners\LogAuthenticationAttempt',
    ],

    'Illuminate\Auth\Events\Login' => [
        'App\Listeners\LogSuccessfulLogin',
    ],

    'Illuminate\Auth\Events\Logout' => [
        'App\Listeners\LogSuccessfulLogout',
    ],

    'Illuminate\Auth\Events\Lockout' => [
        'App\Listeners\LogLockout',
    ],
];

Như vậy mình đã giới thiệu chi tiết về Authentication trong Laravel 5.3.Hi vọng với những hướng dẫn của mình sẽ giúp được các bạn có thể tìm hiểu về Laravel tốt hơn. 😄


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí