Laravel アプリケーション (Laravel 3 から Laravel 4 にアップグレードしています) でアクセス制御にAuthorityパッケージを使用しています。アクセス ルールの単体テストのために、別のユーザーとして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では、構文/API の一部が変更され、as_user()は存在しなくなりました。2 つの方法を試しましたが、期待どおりの結果が得られません。
試行 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を出力すると、ユーザーが切り替えられたことがわかります。しかし、$this->getCurrentUser()->nameをAuthority::can()関数内のハックとして出力すると、ユーザーがこのスコープ内で切り替えられていないことが示されます (したがって、間違った結果になります)。
試行 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
例外が発生する Authority 構成ファイルの 9 行目は、現在のユーザーが期待どおりに設定されていないことを示しています。
8: $user = $authority->getCurrentUser();
9: if(count($user->roles) === 0) return false;
通常のアプリケーションの使用 (つまり、単体テスト内でユーザーを切り替えない) では、Authority は期待どおりに動作しているように見えます。
私は何を間違っていますか?