0

Я работаю над приложением с использованием Laravel 5.2.45, которое взаимодействует с ионным интерфейсом и с серверной стороны тестируется с использованием Postman. Я немного застрял о том, как правильно осуществить проверку, чтобы увидеть, если сеанс пользователя уже активен и регистрируется в Ниже приводится описано сценарий:.Laravel 5.2 или 5.3: Как правильно выполнить проверку, чтобы узнать, является ли сеанс уже зарегистрированным

Удаление локального хранилища: Say пользователь регистрируется с система и вошла в систему. Вся соответствующая информация возвращается при тестировании в ионном браузере и в почтальоне. Кроме того, сеанс генерируется в базе данных, а не в файле (как и предполагалось, нет, мы не хотим использовать файлы для сеансов). Теперь скажите, что пользователь проверяет браузер и удаляет данные локального хранилища и удаляет всю кешированную информацию и файлы cookie. После удаления всех сохраненных данных на стороне клиента пользователь пытается войти в систему с теми же учетными данными. Здесь возникает проблема.

Проблема:
Когда пользователь нажимает маршрут/входа в систему, это будет автоматически генерировать еще одну новую сессию в базе данных без необходимости сначала проверяется, есть ли уже другой активный сеанс в БД. Это происходит каждый раз, когда я просматриваю маршрут/логин. По сути, если кто-то должен был войти в систему, а затем удалите их локальное хранилище и снова войдите в систему (и сделайте это 1000+ раз), они могут в конечном итоге потопить базу данных с неисправными сеансами в таблице сеансов, все они привязаны к учетной записи пользователя.

Единственный раз, когда кто-то должен иметь несколько сеансов в таблице сеансов, когда они входят в систему с двух отдельных устройств. В этом случае, однако, в это время должно быть активным только 1 сеанс, но в базе данных все равно будет записано 2 сеанса для этого пользователя.

Вопрос: Как или где бы я осуществить чистый, правильный путь для системы, чтобы проверить через Middleware, что уже есть живой/активный сеанс в базе данных и Аутентифицировать/Attach учетных данных, пользователь пытается войти в систему с помощью активного сеанса в БД на этот активный сеанс?

Этот вопрос основан на чистой установке Laravel (5.2.45) или выше. Если дополнительный код не был добавлен на серверной стороне, и не используются шаблоны блейд-серверов NO. Перенаправление происходит через ионную платформу, и при тестировании в Postman следует ожидать возвращения данных.

Где я пошел:

Ссылка ниже точной, но не достаточно описательный, как реализовать его и принять его дальше, потому что у меня есть другие процессы, которые должны произойти после того, как она делает Auth :: чек() how to check if user is logged in by his session in route and then call controller method in laravel?

Любая помощь в этом очень ценится. Спасибо!

ответ

2

я следующее:

1) в routes.php определяю промежуточное программное обеспечение для маршрутизации группы:

Route::group(['prefix' => 'auth'], function() { 
    Route::get('/', ['as' => 'auth', 'uses' => '[email protected]']); 
    Route::post('/', ['as' => 'auth.attempt', 'uses' => '[email protected]']); 
    Route::delete('/', ['uses' => '[email protected]']); 
    Route::any('destroy', ['as' => 'auth.destroy', 'uses' => '[email protected]']); 
}); 

Route::group(['prefix' => 'billing', 'namespace' => 'Billing', 'middleware' => ['App\Http\Middleware\HasAccessToBilling']], function() 
{ 
    Route::any('/', ['as' => 'billing', 'uses' => '[email protected]']); 
    Route::get('profile', ['as' => 'billing.profile', 'uses' => '[email protected]']); 
}); 

2) в app/Http/Middleware/HasAccessToBilling.php я определяю:

<?php namespace App\Http\Middleware; 

use App\Library\Auth; 
use Closure; 
use Illuminate\Http\Request; 

class HasAccessToBilling 
{ 

    /** 
    * Handle an incoming request. 
    * 
    * @param \Illuminate\Http\Request $request 
    * @param \Closure $next 
    * @return mixed 
    */ 
    public function handle(Request $request, Closure $next) 
    { 
     if (Auth::hasAccessTo('billing', $request)) { 
      return $next($request); 
     } 
     return redirect()->route('auth'); 
    } 
} 

3) в app/Library/Auth.php: (изготовленный под заказ Auth lib)

<?php namespace App\Library; 

use \App\Models\User; // I keep Models in app/Models folder and define namespace App\Models; 
use Illuminate\Http\Request; 
use Crypt; 

class Auth 
{ 
    const REALMS = 'api,billing'; 

    public static function attempt($realm, Request $request) 
    { 
     $username = $request->input('username'); 
     $password = $request->input('password'); 
     $remember = $request->input('remember', false); 

     $User = (filter_var($username, FILTER_VALIDATE_EMAIL)) ? 
      User::whereEmail($username)->first() 
      : User::whereUsername($username)->first(); 
     if (!$User) { 
      return false; 
     } 

     if (!$User->checkPassword($password)) { 
      return false; 
     } 

     $realms = (is_array($realm) AND !empty($realm)) ? $realm : [$realm]; 
     $auth = [ 
      'timestamp' => time(), 
      'user_id' => $User->id, 
      'access_to' => [], 
      'roles' => [], 
      'permissions' => [] 
     ]; 
     $auth = $request->session()->get('auth', $auth); 
     foreach ($realms AS $realm) { 
      if (!in_array($realm, $auth['access_to'])) { 
       $auth['access_to'][] = $realm; 
      } 
     } 

     if($remember) { 
      $rememberToken = Crypt::encrypt(json_encode($auth)); 
      $auth['remember-token'] = $rememberToken; 
     } 
     $request->session()->put('auth', $auth); 

     return $auth; 
    } 

    public static function destroy(Request $request, $realm = null) 
    { 
     if (is_null($realm)) { 
      $request->session()->forget('auth'); 
      return true; 
     } 

     $auth = $request->session()->get('auth'); 
     if (isset($auth['access_to'])) { 
      $realms = (is_array($realm) AND !empty($realm)) ? $realm : [$realm]; 
      foreach ($realms AS $realm) { 
       $key = array_search($realm, $auth['access_to']); 
       unset($auth['access_to'][$key]); 
      } 
      $auth['access_to'] = array_values($auth['access_to']); 
      if(sizeof($auth['access_to']) > 0) { 
       $request->session()->put('auth', $auth); 
      } 
      else { 
       $request->session()->forget('auth'); 
      } 
      return true; 
     } 
     return false; 
    } 

    public static function recoverSession(Request $request) 
    { 
     $rememberToken = $request->cookie('remember-token', null); 
     if(is_null($rememberToken)) { 
      return null; 
     } 

     try{ 
      $rememberToken = Crypt::decrypt($rememberToken); 
      $auth = json_decode($rememberToken, true); 
      $request->session()->set('auth', $auth); 
     } 
     catch(\Exception $ex) {} 

     return $request->session()->get('auth'); 
    } 

    public static function hasAccessTo($realm, Request $request) 
    { 
     $auth = $request->session()->get('auth', null); 
     if (is_null($auth)) { 
      $auth = self::recoverSession($request); 
     } 

     return (isset($auth['access_to']))? 
       in_array($realm, $auth['access_to']) 
       : false; 
    } 
} 

4) в app/Models/User.php: (не забудьте создать папку Models)

<?php namespace App\Models; 

use Illuminate\Database\Eloquent\Model; 
use Hash; 
use Closure; 

class User extends Model 
{ 
    const USERNAME_MAXLEN = 2; 
    const PASSWORD_MAXLEN = 5; 
    protected $table = 'users'; 
    protected $fillable = ['username', 'email', 'password', 'active', 'deleted']; 

    public function checkPassword($password) 
    { 
     return Hash::check($password, $this->password); 
    } 

    public function updateAndCall($attributes = [], Closure $closure) { 
     if(isset($attributes['password'])) { 
      $attributes['password'] = Hash::make($attributes['password']); 
     } 
     $this->update($attributes); 
     return $closure($this); 
    } 

    public static function createAndCall($attributes = [], Closure $closure) { 
     if(isset($attributes['password'])) { 
      $attributes['password'] = Hash::make($attributes['password']); 
     } 
     $Record = self::create($attributes); 
     return $closure($Record); 
    } 
} 

5) в app\Http\Controllers\AuthController.php:

<?php namespace App\Http\Controllers; 

use Illuminate\Http\Request; 
use App\Library\Auth; 

class AuthController extends Controller 
{ 
    public function index() 
    { 

     return view('auth.index'); 
    } 

    public function attempt(Request $request) 
    { 
     $realms = $request->get('realm', Auth::REALMS); 
     if (!is_null($realms)) { 
      $realms = explode(',', $realms); 
     } 

     $auth = Auth::attempt($realms, $request); 
     if ($auth === false) { 
      return $this->forbidden('Username and/or Password invalid!'); 
     } 

     foreach ($realms AS $realm) { 
      if (!Auth::hasAccessTo($realm, $request)) { 
       return $this->forbidden('Access denied'); 
      } 
     } 

     if (isset($auth['remember-token'])) { 
      $this->setCookie('remember-token', $auth['remember-token'], 525600); // 1 year 
     } 

     return $this->ok(null, ['redirectTo' => $realms[0]]); 
    } 

    public function destroy(Request $request) 
    { 
     $realms = $request->get('realm', Auth::REALMS); 
     if (is_array($realms) AND !empty($realms)) { 
      $realms = explode(',', $realms); 
     } 
     Auth::destroy($request, $realms); 
     $this->deleteCookie('remember-token'); 

     return redirect()->route('auth'); 
    } 
} 



заполнить свободно использовать его, как Вы желаете (;

+1

Спасибо за быстрый ответ. Я исследую вашу концепцию и применяю, если все будет проверено. Если я в конечном итоге сделаю это, я отмечу как ответ! Еще раз спасибо за помощь в этом. –

+1

Концепции, показанные в приведенном вами примере, помогли мне потратить много времени на устранение основной причины моих проблем и что делать с тем, как правильно выполнять обработку сеанса. Я опубликую результат того, что я получил в свое время, когда я стабилизировал все в надежде помочь другим, кто может столкнуться с теми же проблемами, которые я обнаружил. Еще раз спасибо! –

+0

@ user3124770 Я очень надеюсь, что это лучшее решение для вас. – num8er

Смежные вопросы