Laravel - 按用户ID强制注销特定用户

Dan*_*nai 5 php authentication laravel laravel-5

我使用Laravel 5.2.

我想知道如何强制用户通过id注销?

我正在构建一个管理面板,其中包含禁用当前登录到Web应用程序的特定用户的选项.

Laravel为当前用户提供了此选项:

Auth::logout()
Run Code Online (Sandbox Code Playgroud)

但我不想退出当前用户,因为我是Auth用户.我需要通过它强制注销特定用户id.就像我们登录具有特定ID的用户一样:

Auth::loginUsingId($id);
Run Code Online (Sandbox Code Playgroud)

有这样的事情:

Auth::logoutUsingId($id);
Run Code Online (Sandbox Code Playgroud)

sep*_*ehr 10

目前,没有直接的方法来做到这一点; 由于StatefulGuard合同及其SessionGuard实施不像登录logoutUsingId()那样提供.

您需要向users表添加一个新字段,并在希望注销特定用户时将其设置为true.然后使用中间件检查当前用户是否需要强制注销.

这是一个快速实现.

1.添加新字段

让我们为用户表迁移类添加一个新字段:

<?php

use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            // ...
            $table->boolean('logout')->default(false);
            // other fields...
        });
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

确保php artisan migrate:refresh [--seed]在更改迁移后运行.

2.强制注销中间件

让我们创建一个新的中间件:

php artisan make:middleware LogoutUsers
Run Code Online (Sandbox Code Playgroud)

这是检查用户是否需要被踢出的逻辑:

<?php

namespace App\Http\Middleware;

use Auth;
use Closure;

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

        // You might want to create a method on your model to
        // prevent direct access to the `logout` property. Something
        // like `markedForLogout()` maybe.
        if (! empty($user->logout)) {
            // Not for the next time!
            // Maybe a `unmarkForLogout()` method is appropriate here.
            $user->logout = false;
            $user->save();

            // Log her out
            Auth::logout();

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

        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

3.在HTTP内核中注册中间件

打开app/Http/Kernel.php并添加中间件的FQN:

/**
 * The application's route middleware groups.
 *
 * @var array
 */
protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,
        \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
        \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
        \App\Http\Middleware\LogoutUsers::class, // <= Here
    ],

    'api' => [
        'throttle:60,1',
        'bindings',
    ],
];
Run Code Online (Sandbox Code Playgroud)

这是未经测试的代码,但它应该给你这个想法.在您的User模型中添加几个API方法以配合此功能是一种很好的做法:

  • markedForLogout():检查用户的logout标志.
  • markForLogout():将用户的logout标志设置为true.
  • unmarkForLogout():将用户的logout标志设置为false.

然后在管理方面(我想这是你的情况),你只需要调用markForLogout()特定的用户模型,在下一个请求时将他踢出去.或者,如果模型对象不可用,您可以使用查询构建器来设置标志:

User::where('id', $userId)
    ->update(['logout' => true]);
Run Code Online (Sandbox Code Playgroud)

它可以是一种markForLogoutById($id)方法.

相关讨论
[建议]按ID
删除用户删除记录用户时的多个语句


Ima*_*lah 6

使用 setUser 查找解决方案

  • 亲爱的@KashifSaleem!只需 Auth::logout(); 将注销当前用户,这里我们关心的是注销当前用户以外的用户。 (8认同)