[英]check authenticate user in middleware using laravel 5.6
我正在尝试在 Laravel 5.6 中创建一个中间件来检查用户是否通过身份验证。 我的中间件:
checklogin.php
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Support\Facades\Auth;
class checklogin
{
public function handle($request, Closure $next, $guard = null)
{
if (Auth::guard($guard)->check()) {
return redirect('/welcome');
}
return $next($request);
}
}
我在受保护的 $routeMiddleware 的 kernel.php 中添加了这个:
'checklogin' => \App\Http\Middleware\checklogin::class,
我还在路由器上添加了它:
Route::get('/login','loginController@index');
Route::post('/welcome','loginController@store')->middleware('checklogin');
并且还使用了
use App\Http\Middleware\checklogin;
我的登录控制器是:
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use DB;
use App\Http\Requests;
use Session;
use Illuminate\Support\Facades\Redirect;
session_start();
class loginController extends Controller
{
public function index()
{
return view('/login');
}
public function store(Request $request)
{
$name = $request->name;
$result = DB::table('tbl_login')
->where('name',$name)
->first();
if ($result) {
Session::put('name',$result->name);
Session::put('id',$result->id);
return Redirect::to('/welcome');
}
else{
Session::put('messege','invalid email or password');
return Redirect::to('/login');
}
}
我的 login.blade.php 是:
<p class="alert-danger">
<?php
$messege = Session::get('messege');
if ($messege) {
echo "$messege";
Session::put('messege',null);
}
?>
</p>
<form method="POST" action="{{url('/welcome')}}">
@csrf
<label for="name" >Name</label>
<input id="name" type="text" name="name" value="" required autofocus>
<button type="submit" class="btn btn-primary">
login
</button>
</form>
但它显示此错误消息:
Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException
No message
我是 laravel 的新手。 我刚开始学习。 我不知道问题出在哪里。 请帮忙!
似乎还可以,但请检查此行
if (Auth::guard($guard)->check()) {
return redirect('/login');
}
您不能重定向POST路由,您只能重定向可以使用/login
GET路由或任何其他路由
或在GET中创建其他路线
Route::get('/welcome','loginController@home')->middleware('checklogin');
public function home()
{
return view('/home');
}
你可以这样做:
在您的控制器中,您必须使用自己的中间件添加构造。
public function __construct()
{
$this->middleware(function ($request, $next) {
$this->user = $request->user('api');
return $next($request);
});
}
这里最重要的部分是
$request->user('api');
如果您的路由是公开的(没有任何中间件进行限制),它将使用所有可公开访问的信息,因此不会有会话、令牌等。 $request->user(); 的正常使用; 不会工作。
幸运的是$request->user()可以接受一个参数
/**
* Get the user making the request.
*
* @param string|null $guard
* @return mixed
*/
public function user($guard = null)
{
return call_user_func($this->getUserResolver(), $guard);
}
因此,如果您执行$request->user('api') ,它将使用 api 保护检索用户,因为这些信息可以在 'api' 保护中访问。
现在在您的代码中,您可以检查 $this->user 是否为 null(null 它将不是登录用户,对象它将是登录用户)。
资料来源:答案 #1,第 3 点这里https://www.py4u.net/discuss/32099
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.