【发布时间】:2014-08-08 13:43:12
【问题描述】:
我知道如何登录用户,但如何从应用程序中注销指定用户?似乎没有足够的报道。
【问题讨论】:
-
您的意思是用户在单击用户注销按钮时从您的应用程序中注销?
-
不,我想从我的控制器中手动注销特定用户,例如
Auth::logout($user)或这些行之间的内容。
标签: authentication laravel logout
我知道如何登录用户,但如何从应用程序中注销指定用户?似乎没有足够的报道。
【问题讨论】:
Auth::logout($user) 或这些行之间的内容。
标签: authentication laravel logout
当您是管理员并想要阻止某些用户时会发生此问题。然后,当您阻止用户时,您想立即注销他。对于 laravel 5.2(可能也适用于较低版本),您可以创建 middelware:
创建中间件
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class BockedUser
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @param string|null $guard
* @return mixed
*/
public function handle($request, Closure $next, $guard = null)
{
$user = Auth::user();
if ($user and $user->is_bocked) {
Auth::logout();
return redirect('/login');
}
return $next($request);
}
}
并且在 $middlewareGroups > 'web' 部分的 app/Http/Kernel.php 中添加 \App\Http\Middleware\BockedUser::class。我认为你所有的路线都在Route::group(['middleware' => 'web'], function () { .. all your routes ..}
【讨论】:
您可以在 laravel 4.2 中为特定用户注销执行此操作,并且您正在使用多重身份验证
/* for normal user logout */
Auth::user()->logout();
/* for admin user logout */
Auth::admin()->logout();
/* for manager user logout */
Auth::manager()->logout();
当你让用户授权时
【讨论】:
当用户访问任何经过身份验证的功能时,您可以注销用户,例如编辑个人资料、编辑帖子、创建帖子等。例如:
public function edit()
{
if (!\Auth::user()->active)
{
\Auth::logout();
return redirect('/');
}
// code here
}
【讨论】:
获取当前用户
$user = Auth::user();
您想要的注销用户
$userToLogout = User::find(5);
Auth::setUser($userToLogout);
Auth::logout();
重新设置当前用户
Auth::setUser($user);
【讨论】:
Auth::loginUsingId($your_current_user->id)。这样您就不会被注销。
如果你知道他的用户ID,
//注销特定用户:
//$id == user id to to whom you want to logout
\DB::table('users')->where('id', $id)->update(['remember_token' => null]);
\DB::table('sessions')->where('user_id', $id)->delete();
//注销所有用户
$sessions = glob(storage_path("framework/sessions/*"));
foreach ($sessions as $file) {
if (is_file($file))
unlink($file);
}
//$id == user id to to whom you want to logout
\DB::table('users')->update(['remember_token' => null]);
\DB::table('sessions')->truncate();
如果您不使用数据库作为会话驱动程序,则无需使用会话表操作。
【讨论】:
这就是我在中间件中的做法:
public function handle($request, Closure $next)
{
if (!auth()->user()->is_approved) {
Auth::logout();
return redirect()->route('unauthorized');
}
return $next($request);
}
只是为了添加一些上下文。
【讨论】: