我在我的 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;
对于正常的应用程序使用(即不在单元测试中切换用户),权限似乎按预期运行。
我究竟做错了什么?