我使用的是Laravel 5.2。
我想知道如何强制用户通过ID注销?
我正在构建一个管理面板,其中包含禁用当前登录到Web应用程序的特定用户的选项。
Laravel为当前用户提供了此选项:
Auth::logout()
但我不想退出当前用户,因为我是Auth用户。我需要通过id
强制注销特定用户。就像我们登录具有特定ID的用户一样:
Auth::loginUsingId($id);
有这样的事情:
Auth::logoutUsingId($id);
答案 0 :(得分:8)
目前,没有直接的方法可以做到这一点;由于StatefulGuard
合同及其SessionGuard
实施不像login那样提供logoutUsingId()
。
您需要向users表添加新字段,并在希望注销特定用户时将其设置为true。然后使用中间件检查当前用户是否需要强制注销。
这是一个快速实施。
让我们向用户表迁移类添加一个新字段:
<?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...
});
}
// ...
}
确保在更改迁移后运行php artisan migrate:refresh [--seed]
。
让我们创建一个新的middleware:
php artisan make:middleware LogoutUsers
这是检查用户是否需要被踢出的逻辑:
<?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);
}
}
打开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',
],
];
这是未经测试的代码,但它应该给你这个想法。在User
模型中添加几个API方法以配合此功能是一种很好的做法:
markedForLogout()
:检查用户的logout
标记。 markForLogout()
:将用户的logout
标记设置为true
。 unmarkForLogout()
:将用户的logout
标记设置为false
。 然后在管理方面(我认为这是你的情况),你只需要在特定的用户模型上调用markForLogout()
,以便在下一个请求时将他踢出去。或者,如果模型对象不可用,您可以使用查询构建器来设置标志:
User::where('id', $userId)
->update(['logout' => true]);
它可以是markForLogoutById($id)
方法。
相关讨论
[Proposal] Log out users by ID
Multiple statements when logged users are deleted
答案 1 :(得分:0)
获取当前用户
$user = Auth::user();
您要通过ID退出的用户
$userToLogout = User::find(5);
Auth::setUser($userToLogout);
Auth::logout();
再次设置当前用户
Auth::setUser($user);
答案 2 :(得分:0)
我建议您使用自定义检查覆盖App \ Http \ Middleware \ Authenticate handle 功能
if ($this->auth->user()->deleted_at) {
$this->auth->logout();
return redirect()->route('login');
}
答案 3 :(得分:0)
设置和下面的代码我用它来注销用户并使用清单锁定他的帐户(可选),我是通过 Ajax 请求完成的:
-在 config/session.php 中,更改为:
'driver' => env('SESSION_DRIVER', 'database'),
-运行 php artisan session:table -run php artisan migrate //创建会话表。
-in .env 文件:将 SESSION_DRIVER=file 更改为 SESSION_DRIVER=database
现在是编码部分: -在控制器中:
function ajaxCheckList(Request $request)
{
// \Log::info($request);
$user = \App\Models\User::findOrFail($request['user_id']);
$locked = 0;
if ($user->locked == 1) {
$user->locked = 0;
$locked = 0;
} else {
$user->locked = 1;
$locked = 1;
DB::table('sessions')
->where('user_id', $request['user_id'])
->delete();
}
$user->update(['locked' => $locked]);
}