123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- <?php
- namespace Illuminate\Tests\Auth;
- use Illuminate\Auth\Access\AuthorizationException;
- use Illuminate\Auth\Access\Gate;
- use Illuminate\Auth\Middleware\Authorize;
- use Illuminate\Container\Container;
- use Illuminate\Contracts\Auth\Access\Gate as GateContract;
- use Illuminate\Contracts\Routing\Registrar;
- use Illuminate\Database\Eloquent\Model;
- use Illuminate\Events\Dispatcher;
- use Illuminate\Http\Request;
- use Illuminate\Routing\Middleware\SubstituteBindings;
- use Illuminate\Routing\Router;
- use Mockery as m;
- use PHPUnit\Framework\TestCase;
- use stdClass;
- class AuthorizeMiddlewareTest extends TestCase
- {
- protected $container;
- protected $user;
- protected $router;
- protected function setUp(): void
- {
- parent::setUp();
- $this->user = new stdClass;
- Container::setInstance($this->container = new Container);
- $this->container->singleton(GateContract::class, function () {
- return new Gate($this->container, function () {
- return $this->user;
- });
- });
- $this->router = new Router(new Dispatcher, $this->container);
- $this->container->singleton(Registrar::class, function () {
- return $this->router;
- });
- }
- protected function tearDown(): void
- {
- m::close();
- Container::setInstance(null);
- }
- public function testSimpleAbilityUnauthorized()
- {
- $this->expectException(AuthorizationException::class);
- $this->expectExceptionMessage('This action is unauthorized.');
- $this->gate()->define('view-dashboard', function ($user, $additional = null) {
- $this->assertNull($additional);
- return false;
- });
- $this->router->get('dashboard', [
- 'middleware' => Authorize::class.':view-dashboard',
- 'uses' => function () {
- return 'success';
- },
- ]);
- $this->router->dispatch(Request::create('dashboard', 'GET'));
- }
- public function testSimpleAbilityAuthorized()
- {
- $this->gate()->define('view-dashboard', function ($user) {
- return true;
- });
- $this->router->get('dashboard', [
- 'middleware' => Authorize::class.':view-dashboard',
- 'uses' => function () {
- return 'success';
- },
- ]);
- $response = $this->router->dispatch(Request::create('dashboard', 'GET'));
- $this->assertSame('success', $response->content());
- }
- public function testSimpleAbilityWithStringParameter()
- {
- $this->gate()->define('view-dashboard', function ($user, $param) {
- return $param === 'some string';
- });
- $this->router->get('dashboard', [
- 'middleware' => Authorize::class.':view-dashboard,"some string"',
- 'uses' => function () {
- return 'success';
- },
- ]);
- $response = $this->router->dispatch(Request::create('dashboard', 'GET'));
- $this->assertSame('success', $response->content());
- }
- public function testSimpleAbilityWithNullParameter()
- {
- $this->gate()->define('view-dashboard', function ($user, $param = null) {
- $this->assertNull($param);
- return true;
- });
- $this->router->get('dashboard', [
- 'middleware' => Authorize::class.':view-dashboard,null',
- 'uses' => function () {
- return 'success';
- },
- ]);
- $this->router->dispatch(Request::create('dashboard', 'GET'));
- }
- public function testSimpleAbilityWithOptionalParameter()
- {
- $post = new stdClass;
- $this->router->bind('post', function () use ($post) {
- return $post;
- });
- $this->gate()->define('view-comments', function ($user, $model = null) {
- return true;
- });
- $middleware = [SubstituteBindings::class, Authorize::class.':view-comments,post'];
- $this->router->get('comments', [
- 'middleware' => $middleware,
- 'uses' => function () {
- return 'success';
- },
- ]);
- $this->router->get('posts/{post}/comments', [
- 'middleware' => $middleware,
- 'uses' => function () {
- return 'success';
- },
- ]);
- $response = $this->router->dispatch(Request::create('posts/1/comments', 'GET'));
- $this->assertSame('success', $response->content());
- $response = $this->router->dispatch(Request::create('comments', 'GET'));
- $this->assertSame('success', $response->content());
- }
- public function testSimpleAbilityWithStringParameterFromRouteParameter()
- {
- $this->gate()->define('view-dashboard', function ($user, $param) {
- return $param === 'true';
- });
- $this->router->get('dashboard/{route_parameter}', [
- 'middleware' => Authorize::class.':view-dashboard,route_parameter',
- 'uses' => function () {
- return 'success';
- },
- ]);
- $response = $this->router->dispatch(Request::create('dashboard/true', 'GET'));
- $this->assertSame('success', $response->content());
- }
- public function testModelTypeUnauthorized()
- {
- $this->expectException(AuthorizationException::class);
- $this->expectExceptionMessage('This action is unauthorized.');
- $this->gate()->define('create', function ($user, $model) {
- $this->assertSame('App\User', $model);
- return false;
- });
- $this->router->get('users/create', [
- 'middleware' => [SubstituteBindings::class, Authorize::class.':create,App\User'],
- 'uses' => function () {
- return 'success';
- },
- ]);
- $this->router->dispatch(Request::create('users/create', 'GET'));
- }
- public function testModelTypeAuthorized()
- {
- $this->gate()->define('create', function ($user, $model) {
- $this->assertSame('App\User', $model);
- return true;
- });
- $this->router->get('users/create', [
- 'middleware' => Authorize::class.':create,App\User',
- 'uses' => function () {
- return 'success';
- },
- ]);
- $response = $this->router->dispatch(Request::create('users/create', 'GET'));
- $this->assertSame('success', $response->content());
- }
- public function testModelUnauthorized()
- {
- $this->expectException(AuthorizationException::class);
- $this->expectExceptionMessage('This action is unauthorized.');
- $post = new stdClass;
- $this->router->bind('post', function () use ($post) {
- return $post;
- });
- $this->gate()->define('edit', function ($user, $model) use ($post) {
- $this->assertSame($model, $post);
- return false;
- });
- $this->router->get('posts/{post}/edit', [
- 'middleware' => [SubstituteBindings::class, Authorize::class.':edit,post'],
- 'uses' => function () {
- return 'success';
- },
- ]);
- $this->router->dispatch(Request::create('posts/1/edit', 'GET'));
- }
- public function testModelAuthorized()
- {
- $post = new stdClass;
- $this->router->bind('post', function () use ($post) {
- return $post;
- });
- $this->gate()->define('edit', function ($user, $model) use ($post) {
- $this->assertSame($model, $post);
- return true;
- });
- $this->router->get('posts/{post}/edit', [
- 'middleware' => [SubstituteBindings::class, Authorize::class.':edit,post'],
- 'uses' => function () {
- return 'success';
- },
- ]);
- $response = $this->router->dispatch(Request::create('posts/1/edit', 'GET'));
- $this->assertSame('success', $response->content());
- }
- public function testModelInstanceAsParameter()
- {
- $instance = m::mock(Model::class);
- $this->gate()->define('success', function ($user, $model) use ($instance) {
- $this->assertSame($model, $instance);
- return true;
- });
- $request = m::mock(Request::class);
- $nextParam = null;
- $next = function ($param) use (&$nextParam) {
- $nextParam = $param;
- };
- (new Authorize($this->gate()))
- ->handle($request, $next, 'success', $instance);
- }
- /**
- * Get the Gate instance from the container.
- *
- * @return \Illuminate\Auth\Access\Gate
- */
- protected function gate()
- {
- return $this->container->make(GateContract::class);
- }
- }
|