标签: laravel-middleware

Laravel刀片模板特定代码

目前我们在几个项目中使用Laravel框架,但我们不断喜欢的一个问题是以下问题:

假设您有一个主页和一个内容页面

HomepageController具有所有主页特定的PHP代码ContentpageController具有所有内容特定的PHP代码

我们有一个app.blade.php

@yield('page')
Run Code Online (Sandbox Code Playgroud)

HomepageController调用包含的视图homepage.blade.php

@extends('app')

@section('page')
     Some HTML part
     @include('parts.top_5')
@endsection
Run Code Online (Sandbox Code Playgroud)

ContentController调用包含的视图content.blade.php

@extends('app')

@section('page')
     Some different HTML part
     @include('parts.top_5')
@endsection
Run Code Online (Sandbox Code Playgroud)

在这里你可以看到两个页面都包含parts.top_5,前5个需要一些特定的变量才能输出top5.现在问题是我们正在复制两个控制器或分组中间件中top5变量的代码,但是当包含该部件时,是否有更好的解决方案来生成一些刀片特定变量?有点像加载刀片模板时运行控制器功能?

我一直在网上搜索,但似乎找不到任何有相同问题的人.希望有人可以帮助我解决这个令人心碎的问题!

php laravel blade laravel-5 laravel-middleware

6
推荐指数
1
解决办法
373
查看次数

Laravel中间件"除了"规则不起作用

我在构造函数中有一个带有以下内容的控制器:

$this->middleware('guest', ['except' =>
    [
        'logout',
        'auth/facebook',
        'auth/facebook/callback',
        'auth/facebook/unlink'
    ]
]);
Run Code Online (Sandbox Code Playgroud)

"注销"规则(默认存在)工作正常,但我添加的其他3个规则将被忽略.路线routes.php如下:

Route::group(['middleware' => ['web']],function(){

    Route::auth();

    // Facebook auth
    Route::get('/auth/facebook', 'Auth\AuthController@redirectToFacebook')->name('facebook_auth');
    Route::get('/auth/facebook/callback', 'Auth\AuthController@handleFacebookCallback')->name('facebook_callback');
    Route::get('/auth/facebook/unlink', 'Auth\AuthController@handleFacebookUnlink')->name('facebook_unlink');
}
Run Code Online (Sandbox Code Playgroud)

如果我访问auth/facebook,auth/facebook/callbackauth/facebook/unlink登录时我被中间件拒绝并被扔回主页.

我已经尝试通过继续指定'除'规则,/因此它们routes.php完全匹配路线,但没有区别.任何想法为什么忽略这些规则,而默认的"注销"规则被尊重?

干杯!

laravel laravel-5 laravel-middleware

6
推荐指数
1
解决办法
1万
查看次数

Laravel 5.3中间件类不存在

我想基于中间件进行一些身份验证..但不幸的是,它返回,因为类不存在

这是我的中间件

Staff.php

<?php

namespace App\Http\Middleware;

use Closure;
use Auth;

class Staff
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $user = Auth::user()->type;
        if ($user == 'S'){
            return $next($request);
        }

        return "no";
    }
}
Run Code Online (Sandbox Code Playgroud)

这是kernel.php

<?php

namespace App\Console;

use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;

class Kernel extends ConsoleKernel
{
    /**
     * The Artisan commands provided by your application.
     *
     * @var array …
Run Code Online (Sandbox Code Playgroud)

php laravel-middleware laravel-5.3

6
推荐指数
1
解决办法
1万
查看次数

Laravel 419 错误 -VerifyCsrfToken 问题

我在同一台服务器上托管了多个 Laravel 站点。在我创建的最新网站中,联系表单拒绝提交,并且不会抛出 419 错误。我已经在 web.php 文件中设置了路由,就像其他网站一样,这些网站有实时、有效的联系表单,并且我以完全相同的方式生成和发送令牌 - 使用{{ csrf_field() }}.

我找到了类似问题的答案,指出您可以通过$except向 中的数组添加条目来禁用 Csrf 检查app/Http/Middleware/VerifyCsrfToken.php。我已经验证这确实解决了 419 错误:

protected $except = [
    'contact',
    'contact*',
];
Run Code Online (Sandbox Code Playgroud)

但我当然希望保留 Csrf 功能,并且我仅更新了$except用于故障排除值的数组。

有谁知道新的 Laravel 环境可能有什么不同,尽管传递了生成的令牌,但仍会出现 419 行为?我尝试过更新一些 ENV 设置并切换不同的东西,但除了修改$except数组之外,没有任何其他方法对这个问题产生任何影响。

更新

由于到目前为止已经进行了一些讨论,我想我应该提供一些额外的信息和代码。

首先,这是一个 ajax 形式,但先不要从座位上跳起来。我一直在使用和不使用ajax 的情况下测试表单。如果我想使用 ajax 进行测试,我只需单击连接到 jQuery 侦听器的按钮即可。如果没有,我会更改或删除按钮的 ID,或者$("#formName").submit();在控制台窗口中运行。

上述(ajax、老式提交和带有 的 jquery 选择器.submit();)都会产生完全相同的响应 - 419 错误。

为了完整起见,这是我的 ajax 代码,它可以在我托管的所有其他网站上运行。我定义了一个 postData 数组以使其保持整洁,并console.log()在其后面直接添加了一条语句以(再次)确认令牌生成良好并且正在随请求正确传递。

var postData = {
            
    name: $("#name").val(),
    email: …
Run Code Online (Sandbox Code Playgroud)

php csrf-protection laravel laravel-middleware

6
推荐指数
1
解决办法
2万
查看次数

Laravel 5本地化:exclude/public /目录

我正试图在我的Laravel 5项目中实现本地化,而且我遇到了一个问题.我用来捕获语言的中间件如下:

<?php namespace App\Http\Middleware;

use Closure;
use Illuminate\Routing\Redirector;
use Illuminate\Http\Request;
use Illuminate\Foundation\Application;
use Illuminate\Contracts\Routing\Middleware;

class Language implements Middleware {

    public function __construct(Application $app, Redirector $redirector, Request $request) {
        $this->app = $app;
        $this->redirector = $redirector;
        $this->request = $request;
    }

    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        // Make sure current locale exists.
        $locale = $request->segment(1);


        if ( ! array_key_exists($locale, $this->app->config->get('app.locales'))) {
            $segments …
Run Code Online (Sandbox Code Playgroud)

php laravel laravel-routing laravel-5 laravel-middleware

5
推荐指数
1
解决办法
559
查看次数

如何从Laravel 5中的请求中检索url参数?

我想在中间件中使用模型执行某些操作.这是我想要实现的一个例子:

public function handle($request, Closure $next)
{
    $itemId = $request->param('item'); // <-- invalid code, serves for illustration purposes only
    $item   = Item::find($itemId);

    if($item->isBad()) return redirect(route('dont_worry'));

    return $next($request);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,如何从中检索所需的参数$request

php laravel laravel-5 laravel-request laravel-middleware

5
推荐指数
2
解决办法
2万
查看次数

如何在laravel 5.3中登录时检查用户状态?

我使用过Laravel Authentication(快速入门).但我需要检查用户的状态(已批准/待定).如果未获批准,则会在登录页面中显示错误.我需要知道我必须在哪个文件中进行更改以及更改内容.目前我正在研究Laravel 5.3.

authentication middleware laravel laravel-middleware

5
推荐指数
2
解决办法
8538
查看次数

将 Auth 中间件应用于所有 Laravel 路由

当我在所有控制器中应用身份验证中间件时,除了登录和注册之外,对所有路由进行身份验证的正确方法是什么?有没有办法在一个地方应用身份验证中间件并排除登录、注册路由?

laravel laravel-routing laravel-5 laravel-middleware

5
推荐指数
3
解决办法
1万
查看次数

laravel authorizeResource 总是拒绝访问

我为 API 端点创建了一个资源控制器。我还为模型创建了相应的策略。

如果我使用每个方法进行授权检查

$this->authorize('delete', $asset);
Run Code Online (Sandbox Code Playgroud)

然后它按预期工作。但是如果我将以下内容添加到构造中,我总是会收到 403 禁止。不确定我缺少什么,因为以下内容应适用于所有方法的授权。

$this->authorizeResource(Asset::class, 'asset');
Run Code Online (Sandbox Code Playgroud)

这是我的路线:

Route::group(['middleware' => ['auth:api']], function () {
    Route::Resource('asset', 'AssetsApiController');
});
Run Code Online (Sandbox Code Playgroud)

我的政策是这样注册的:

protected $policies = [
    Asset::class => AssetPolicy::class,
];
Run Code Online (Sandbox Code Playgroud)

我的删除策略方法是

public function delete(User $user, Asset $asset)
{
    return true;
}
Run Code Online (Sandbox Code Playgroud)

API 控制器构造函数如下所示:

public function __construct()
{
    $this->authorizeResource(Asset::class,'asset');
}
Run Code Online (Sandbox Code Playgroud)

API控制器方法是

public function destroy($assetID)
{
    $asset = Asset::findOrFail($assetID);
    $asset->delete();
}
Run Code Online (Sandbox Code Playgroud)

我的路线是

| GET|HEAD  | api/asset              | asset.index   | App\Http\Controllers\AssetsApiController@index   | api,auth:api                      |
| POST      | api/asset              | asset.store   | App\Http\Controllers\AssetsApiController@store   | …
Run Code Online (Sandbox Code Playgroud)

php laravel-middleware laravel-nova laravel-5.8

5
推荐指数
1
解决办法
5297
查看次数

Laravel 在组中间件之前测试中间件中的 URL 参数

我正在使用中间件来检查是否存在来自另一个站点的登录令牌。如果登录令牌存在并且用户尚未登录,我想使用该令牌来登录用户并将其发送到他们想要的页面。如果他们已经登录,我希望它什么也不做。

正如所建议的,这应该是 aServiceProvider吗?

这是我的中间件:

    <?php

namespace App\Http\Middleware;

use Session;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Auth\LoginController;

class CheckRepLoginToken
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle(Request $request, Closure $next){

        $loginToken = $request->repLoginToken;
        $goto = '/'.$request->path();

        if(isset($loginToken) && Auth::guest()){
           (new LoginController)->login($loginToken,$goto);
        }


        return $next($request);
    }
}
Run Code Online (Sandbox Code Playgroud)

问题是我需要在之前运行所有这些,$middlewareGroups因此如果为 true 但存在令牌,则$routeMiddleware用户不会发送到登录屏幕。Auth::guest()

protected $middleware我目前在的 部分中拥有中间件,Kernel无论是否登录,每个人似乎都是“访客”。

这是内核文件:

<?php

namespace …
Run Code Online (Sandbox Code Playgroud)

php authentication laravel laravel-middleware

5
推荐指数
1
解决办法
1286
查看次数