gpt4 book ai didi

php - 在 Laravel PHPUnit 中测试未经授权的用户限制

转载 作者:可可西里 更新时间:2023-11-01 00:41:01 24 4
gpt4 key购买 nike

Laravel 版本 5.2

在我的项目中,role_id = 4 的用户具有 admin 角色,可以管理用户。

我在AuthServiceProvider中定义了以下能力:

public function boot(GateContract $gate)
{
$this->registerPolicies($gate);

$gate->define('can-manage-users', function ($user)
{
return $user->role_id == 4;
});
}

我已经在 UserController __construct 方法中使用了这种能力,如下所示:

public function __construct()
{
$this->authorize('can-manage-users');
}

在 ExampleTest 中,我创建了两个测试来检查定义的授权是否有效。

针对 role_id = 4 的管理员用户的第一个测试。此测试通过。

public function testAdminCanManageUsers()
{
$user = Auth::loginUsingId(1);
$this->actingAs($user)
->visit('users')
->assertResponseOk();
}

第二个测试是针对另一个没有 role_id = 4 的用户。我已经尝试过响应状态 401 和 403。但是测试失败了:

public function testNonAdminCannotManageUsers()
{
$user = Auth::loginUsingId(4);
$this->actingAs($user)
->visit('users')
->assertResponseStatus(403);
}

失败消息的前几行如下:

A request to [http://localhost/users] failed. Received status code [403].

C:\wamp\www\laravel\blog\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithPages.php:196 C:\wamp\www\laravel\blog\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithPages.php:80 C:\wamp\www\laravel\blog\vendor\laravel\framework\src\Illuminate\Foundation\Testing\Concerns\InteractsWithPages.php:61 C:\wamp\www\laravel\blog\tests\ExampleTest.php:33

Caused by exception 'Illuminate\Auth\Access\AuthorizationException' with message 'This action is unauthorized.' in C:\wamp\www\laravel\blog\vendor\laravel\framework\src\Illuminate\Auth\Access\HandlesAuthorization.php:28

我也试过使用“see”方法如下:

public function testNonAdminCannotManageUsers()
{
$user = Auth::loginUsingId(4);
$this->actingAs($user)
->visit('users')
->see('This action is unauthorized.');
}

但它也失败了。我究竟做错了什么?如何才能通过测试?

最佳答案

错误是调用了visit方法。 visit 方法位于 InteractsWithPages 特征中。此方法调用 makeRequest 方法,后者又调用 assertPageLoaded 方法。此方法获取返回的状态代码,如果它获取的代码不是 200,它会捕获 PHPUnitException 并抛出带有消息的 HttpException

"A request to [{$uri}] failed. Received status code [{$status}]."

这就是测试失败并显示上述消息的原因。

使用get方法代替visit方法可以成功通过测试。例如:

public function testNonAdminCannotManageUsers()
{
$user = App\User::where('role_id', '<>', 4)->first();

$this->actingAs($user)
->get('users')
->assertResponseStatus(403);
}

此测试将通过并确认非管理员用户无法访问该 url。

关于php - 在 Laravel PHPUnit 中测试未经授权的用户限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37496939/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com