0

我在我的 Laravel 应用程序(我正在从 Laravel 3 升级到 Laravel 4)中使用授权包进行访问控制。对于访问规则的单元测试,我需要能够以另一个用户的身份调用Authority::can() 。

Laravel 3 Authority中,我使用了as_user()方法:

Authority::as_user($user);
$this->assertTrue(Authority::cannot('read', 'Notifications')); //true

Authority::as_user($superuser);
$this->assertTrue(Authority::can('read', 'Notifications')); //true

Laravel 4 Authority中,一些语法/APIs 已经改变并且as_user()不再存在。我尝试了两种选择,但没有得到预期的结果。

尝试 1(使用 Auth::login() 切换用户):

Auth::login($user);
$this->assertTrue(Authority::cannot('read', 'Notifications')); //true
Auth::logout();

Auth::login($superuser);
$this->assertTrue(Authority::can('read', 'Notifications')); //false (wrong!)
Auth::logout();

在测试中打印Auth::user()->name表明用户已被切换。但是在Authority::can()函数中打印$this->getCurrentUser()->name作为 hack表明用户没有在此范围内切换(因此结果错误)。

尝试2:(使用Authority::setCurrentUser()切换用户)

Authority::setCurrentUser($user);
$this->assertTrue(Authority::cannot('read', 'Notifications')); 

Authority::setCurrentUser($superuser);
$this->assertTrue(Authority::can('read', 'Notifications')); 

//exception!

但在这种情况下,我得到一个例外:

Trying to get property of non-object
/var/www/project/app/config/packages/machuga/authority-l4/config.php:9

发生异常的授权配置文件中的第 9 行表明当前用户未按预期设置:

8: $user = $authority->getCurrentUser();
9: if(count($user->roles) === 0) return false; 

对于正常的应用程序使用(即不在单元测试中切换用户),权限似乎按预期运行。

我究竟做错了什么?

4

1 回答 1

0

Laravel 4 权威模块的作者 (Matthew Machuga) 建议针对权威的新实例进行测试(注意:不是外观)。这也需要重新加载规则集:

$rules = Config::get('authority-l4::initialize', null);

$authority = new Authority\Authority($user);
$rules($authority);
$this->assertTrue(Authority::cannot('read', 'Notifications')); //true

$authority = new Authority\Authority($superuser);
$rules($authority);
$this->assertTrue(Authority::can('read', 'Notifications')); //true

完整的讨论可以在Laravel 论坛上看到。

于 2013-11-01T14:45:56.030 回答