当前位置: 首页 > 知识库问答 >
问题:

Laravel 5.5中忽略了非默认保护

杜辰龙
2023-03-14

我正在为RESTAPI建立一个Laravel项目。基本上,我将用户分为两个表,用户和管理员(模型名)。我想使用默认的Laravel身份验证框架通过web guard对管理员进行身份验证,并使用JWT(tymondesigns提供的包)通过api guard对用户进行身份验证。一切都很顺利。我配置了软件包,在app/auth.php中设置了防护和提供者,并使其几乎正常工作。

我现在可以通过Auth Scaffold注册管理员,并通过用户的自定义登录控制器登录用户。我在浏览器上测试了管理员登录,它工作正常。然后在为用户设置登录之前,我将应用程序/auth.php中的默认保护更改为api(是:web),认为这是有意义的,因为大多数请求将作为API完成。我继续构建自定义登录控制器并测试自定义登录。路由保存在不同的文件中,API路由在路由/api.php和管理路由路由/web.php.我去测试管理员登录在浏览器上,它不再工作。尝试将默认保护再次更改为web,它正在工作。以某种方式,为每个路由定义的保护被忽略,并且只使用默认的保护。我在网上读了很多,我尝试的每一件事都没有成功。

这里是文件:

config/auth.php

'defaults' => [
    'guard' => 'api',
    'passwords' => 'users',
],
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'admins',
    ],
    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],
'providers' => [
    'users' => [
        'driver' => 'eloquent',
        'model' => App\User::class,
    ],
    'admins' => [
        'driver' => 'eloquent',
        'model' => App\Admin::class,
    ]
],
'passwords' => [
    'users' => [
        'provider' => 'users',
        'table' => 'password_resets',
        'expire' => 60,
    ],
    'admins' => [
        'provider' => 'admins',
        'table' => 'password_resets',
        'expire' => 60,
    ]
],

routes/web.php

Route::get('/', function () {
return view('welcome');
});

Auth::routes();

Route::get('home', 'HomeController@index')->name('home');

路线/api.php

Route::middleware('guest')->post('login', 'UserAuth\LoginController@login')->name('user.login');

Route::middleware('auth')->get('user', 'BaseController@loggedUserAPI')
->name('user.user');

任何形式的帮助或建议都将不胜感激。

共有1个答案

林鹭洋
2023-03-14

正如您所说的,如果您使用的是Laravel提供的默认身份验证脚手架,则必须重写Http/Controllers/Auth/LoginController中的guard()方法,否则将始终使用默认的guard。

/**
 * Get the guard to be used during authentication.
 *
 * @return \Illuminate\Contracts\Auth\StatefulGuard
 */
protected function guard()
{
    // specify the guard that should be used for login attempts
    return Auth::guard('web');
}

您还应该修改LoginController的构造函数以使用正确的中间件:

public function __construct()
{
    $this->middleware('guest:web')->except('logout');
}

在您的路由/web.php文件中,您必须告诉您的身份验证和来宾中间件使用正确的防护(如果它不是默认的)

//例如:

Route::middleware('auth:web')->get('admin', 'AdminController@dashboard')
->name('user.user');
 类似资料:
  • 问题内容: 有一个实体A引用(多对一)实体B,从B到A的反向(映射)引用。也有从A到C的引用,以及从C到A的反向引用。当我发布entityManager.remove(A )然后flush(),“ delete”没有发芽!但也没有例外。就像根本没有调用remove()一样。为什么会这样?如果在remove()之前,我们从反向引用B.listOfA和C.listOfA中提取A,则会按预期生成“删除”

  • 我正在尝试在vault中配置数据库机密引擎以生成动态凭据。在此期间,尽管我为SQL server提供了自定义有效端口,但vault似乎正在获取命令中提供的默认端口(通过忽略自定义端口)。请参阅截图 有人可以帮助配置vault数据库密钥引擎以使用自定义端口吗。 附加图像的文本版本: C:\WINDOWS\system32 将数据写入数据库/config/my-mssql数据库时出错:发出API请求时

  • 问题内容: 有一个实体A引用(多对一)实体B,从B到A的反向(映射)引用。也有从A到C的引用,以及从C到A的反向引用。当我发布entityManager.remove(A)然后flush(),“delete”不会发芽!但也没有例外。就像根本没有调用remove()一样。为什么会这样?如果在remove()之前,我们从反向引用B.listOfA和C.listOfA中提取A,则会按预期生成“删除”。

  • 默认情况下,身份认证并不需要访问资源。当安全约束(如果有)包含的url-pattern 是请求 URI 的最佳匹配,且结合了施加在请求的 HTTP 方法上的 auth-constraint(指定的角色),则身份认证是需要的。同样,一个受保护的传输是不需要的,除非应用到请求的安全约束结合了施加在请求的HTTP方法上的 user-data-constraint(有一个受保护的transport-gua

  • 有一个实体A引用(多对一)实体B,从B到A有反向(映射到)引用。还有一个引用A到C,反向引用C到A。当我发出entitymanager . remove(A)then flush()时,没有生成“delete ”!但是也没有例外。就像根本没有调用remove()一样。为什么会这样?如果在remove()之前我们从反向引用B.listOfA和C.listOfA中提取A,那么“delete”就像预期的

  • JOOQ似乎完全忽略了数据库列的默认值。既不会更新ActiveRecord对象,也不会在插入时跳过此列。相反,它尝试将其设置为NULL,这在非NULL列上失败。 例: 我所期望的行为是,要么new记录()用korrekt值初始化所有默认变量(尽管我知道如果结果是自定义函数的结果,这可能很困难:-))。或者INSERT INTO不插入所有带有默认值的未修改列,然后INSERT INTO后面跟着一个S