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.然后使用中间件检查当前用户是否需要强制注销.
这是一个快速实现.
让我们为用户表迁移类添加一个新字段:
<?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]在更改迁移后运行.
让我们创建一个新的中间件:
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)
打开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
删除用户删除记录用户时的多个语句
获取当前用户
$user = Auth::user();
Run Code Online (Sandbox Code Playgroud)通过 id 注销您想要的用户
$userToLogout = User::find(5);
Auth::setUser($userToLogout);
Auth::logout();
Run Code Online (Sandbox Code Playgroud)再次设置当前用户
Auth::setUser($user);
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
5474 次 |
| 最近记录: |