[Bài đọc] Các cơ chế xác thực khác

6. Bảo mật

Xác thực sử dụng một đối tượng User

Nếu bạn cần đăng nhập một user đang tồn tại vào ứng dụng, bạn có thể gọi phương thức login với đối tượng user đó. Đối tượng đã cho phải được thực thi từ contract  Illuminate\Contracts\Auth\Authenticatable. Tất nhiên, model App\User đã thực thi interface này:

Auth::login($user);

// Login and "remember" the given user...
Auth::login($user, true);

Tất nhiên, bạn có thể chỉ định đối tượng guard bạn muốn sử dụng:

Auth::guard('admin')->login($user);

Xác thực user bằng ID

Để đăng nhập một user vào ứng dụng qua ID, bạn sử dụng phương thức loginUsingId. Phương thức này nhận vào khóa chính của user mà bạn muốn xác thực:

Auth::loginUsingId(1);
// Login and "remember" the given user...
Auth::loginUsingId(1, true);

Xác thực User một lần

Sử dụng phương thức once để đăng nhập một user vào ứng dụng. Không có session hay cookie được  tạo ra, điều này hưu ích khi xây dựng stateless API (không lưu trạng thái của người dùng khi truy cập vào ứng dụng):

if (Auth::once($credentials)) {
    //
}

HTTP Basic Authentication

HTTP Basic Authentication cung cấp cách thức xác thực người dùng mà không cần thiết lập trang login. Để bắt đầu, đính kèm middleware auth.basic vào route. Middleware auth.basic đã có trong framework Laravel, vì thế bạn không cần định nghĩa nó:

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

Mỗi khi middleware đã được gắn vào route, bạn sẽ tự động nhận được thông báo nhắc nhở về các thông tin truy cập vào route trên trình duyệt. Mặc định, middleware auth.basic sẽ sử dụng cột email trên các bản ghi như là “tên đăng nhập”.

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:

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

Stateless HTTP Basic Authentication

Bạn có thể sử dụng HTTP Basic Authentication mà không cần thiết lập một user identifier cookie trong session, điều này là một phần hữu ích cho API authentication. Để làm được điều này, sử dụng phương thức onceBasic để tạo một middleware. 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 Illuminate\Support\Facades\Auth;

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

Tiếp theo, đăng ký route middleware và gắn nó vào một route:

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

Thêm các Guard khác

Bạn có thể tạo các authentication guard bằng cách sử dụng phương thức extend của facade Auth. Bạn nên đặt các authentication guarl gọi provider trong service provider. Laravel đã có sẵn AuthServiceProvider, chúng ta có thể đặt mã lệnh trong provider này:

<?php
namespace App\Providers;

use App\Services\Auth\JwtGuard;
use Illuminate\Support\Facades\Auth;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any application authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Auth::extend('jwt', function ($app, $name, array $config) {
            // Return an instance of Illuminate\Contracts\Auth\Guard...

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

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 gồm vài phương thức cần được cài đặt khi tạo một custom guard. Mỗi custom guard được tạo, bạn có thể sử dụng guard trong guard configuration của file cấu hình auth.php:

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

Thêm các User Provider khác

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 cần 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 façade Auth để tạo 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 Illuminate\Support\Facades\Auth;
use App\Extensions\RiakUserProvider;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;

class AuthServiceProvider extends ServiceProvider
{
    /**
     * Register any application authentication / authorization services.
     *
     * @return void
     */
    public function boot()
    {
        $this->registerPolicies();

        Auth::provider('riak', function ($app, array $config) {
            // Return an instance of Illuminate\Contracts\Auth\UserProvider...

            return new RiakUserProvider($app->make('riak.connection'));
        });
    }
}

Sau khi bạn đăng ký provider sử dụng phương thức provider, bạn có thể chuyển sang user provider mới trong file cấu hình 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',
    ],
],

Cuối cùng, bạn có thể sử dụng provider này trong cấu hình guards:

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

Leave a Reply

Your email address will not be published. Required fields are marked *