Пользовательское Middleware Laravel не работает на API-маршрутах - PullRequest
0 голосов
/ 06 мая 2018

У меня был пользователь вызова промежуточного программного обеспечения, который должен фильтровать роль в моей пользовательской таблице в базе данных. это мое промежуточное ПО под названием user

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;
use UsersData;
class User
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        if(Auth::check() && Auth::User()->role=='user'){
            return $next($request);
        }
        return redirect()->route('login')->with('danger',"You don't have an access");
    }
}

и я уже зарегистрировал свое промежуточное ПО в ядре

protected $routeMiddleware = [
        'auth' => \Illuminate\Auth\Middleware\Authenticate::class,
        'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class,
        'bindings' => \Illuminate\Routing\Middleware\SubstituteBindings::class,
        'can' => \Illuminate\Auth\Middleware\Authorize::class,
        'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class,
        'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class,
        'user' => \App\Http\Middleware\User::class,
        'ajax' => \App\Http\Middleware\Ajax::class,
    ];

и маршруты api.php

Route::middleware('user')->group(function () {
        Route::post('province','ApiController@getcity')->name('api.getcity');
        Route::post('courier/getcost','ApiController@getCourierCost')->name('api.getcouriercost');
    });

обновление на config/auth.php вот стражи

<?php

return [

    /*
    |--------------------------------------------------------------------------
    | Authentication Defaults
    |--------------------------------------------------------------------------
    |
    | This option controls the default authentication "guard" and password
    | reset options for your application. You may change these defaults
    | as required, but they're a perfect start for most applications.
    |
    */

    'defaults' => [
        'guard' => 'web',
        'passwords' => 'users',
    ],

    /*
    |--------------------------------------------------------------------------
    | Authentication Guards
    |--------------------------------------------------------------------------
    |
    | Next, you may define every authentication guard for your application.
    | Of course, a great default configuration has been defined for you
    | here which uses session storage and the Eloquent user provider.
    |
    | All authentication drivers have a user provider. This defines how the
    | users are actually retrieved out of your database or other storage
    | mechanisms used by this application to persist your user's data.
    |
    | Supported: "session", "token"
    |
    */

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

        'api' => [
            'driver' => 'token',
            'provider' => 'users',
        ],
    ],

    /*
    |--------------------------------------------------------------------------
    | User Providers
    |--------------------------------------------------------------------------
    |
    | All authentication drivers have a user provider. This defines how the
    | users are actually retrieved out of your database or other storage
    | mechanisms used by this application to persist your user's data.
    |
    | If you have multiple user tables or models you may configure multiple
    | sources which represent each model / table. These sources may then
    | be assigned to any extra authentication guards you have defined.
    |
    | Supported: "database", "eloquent"
    |
    */

    'providers' => [
        'users' => [
            'driver' => 'eloquent',
            'model' => App\User::class,
        ],

        // 'users' => [
        //     'driver' => 'database',
        //     'table' => 'users',
        // ],
    ],

    /*
    |--------------------------------------------------------------------------
    | Resetting Passwords
    |--------------------------------------------------------------------------
    |
    | You may specify multiple password reset configurations if you have more
    | than one user table or model in the application and you want to have
    | separate password reset settings based on the specific user types.
    |
    | The expire time is the number of minutes that the reset token should be
    | considered valid. This security feature keeps tokens short-lived so
    | they have less time to be guessed. You may change this as needed.
    |
    */

    'passwords' => [
        'users' => [
            'provider' => 'users',
            'table' => 'password_resets',
            'expire' => 60,
        ],
    ],

];

все работает на web.php маршрутах, но этот api.php не работает?

Я действительно ценю, если вы это прокомментируете!

Ответы [ 2 ]

0 голосов
/ 06 мая 2018

Одна из причин, по которой у нас есть отдельные файлы маршрутов для web (web.php) и API (api.php), заключается в том, что они используют разные методы аутентификации. Первый - это обычный способ ( Web Auth ), а второй - API Auth , о котором @Babak уже упоминал в своем ответе.

Аутентификация API без сохранения состояния требует маркера для каждого запроса, который генерируется и записывается в отдельную таблицу с user_id в качестве foreign key. Нет страницы входа для аутентификации пользователей API, но вы можете использовать обычную страницу входа, чтобы позволить им запросить API Token и использовать ее для доступа к API. Вы можете использовать различные способы проверки их API Token проверки, например поставить его на request header как Bearer или включить его на request body и т. Д.

0 голосов
/ 06 мая 2018

в запросах ajax вы не можете проверить аутентификацию следующим образом:

Auth::check();

потому что в ajax у вас нет никаких сессий. Вы должны отправить случайный ключ для каждого пользователя, когда он отправляет первый запрос на вход в систему, и, когда вход успешен, сохраните его в поле ключа в его базе данных, после чего, когда ему захочется отправить запрос, он должен отправить ключ, и вы проверит ключ с тем в базе данных, если он в порядке, впустите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...