0

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 は期待どおりに動作しているように見えます。

私は何を間違っていますか?

4

1 に答える 1

0

Laravel 4 Authority モジュールの作成者 (Matthew Machuga) は、Authority の新しいインスタンス (注意: ファサードではない) に対してテストすることを推奨しました。これには、ルールセットのリロードも必要です。

$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 に答える