繁体   English   中英

使用 laravel 5.6 检查中间件中的身份验证用户

[英]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');
}

拉拉维尔 8

如果你不想使用 'auth' 中间件

'auth' 中间件涉及用户登录。如果他没有登录,路由将无法处理。 有时您必须检查用户是否登录公共路线。

你可以这样做:

在您的控制器中,您必须使用自己的中间件添加构造。

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM