feat: Integrate Laravel's built-in authorization Gates
- Integrate Laravel's built-in authorization Gates (#70) - Added guidance for Gates in README.md
This commit is contained in:
parent
259a389595
commit
fe9fd1a7d3
10
README.md
10
README.md
|
@ -277,6 +277,16 @@ Route::group(['middleware' => ['http_request']], function () {
|
||||||
});
|
});
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Using Gates
|
||||||
|
|
||||||
|
You can use Laravel Gates to check if a user has a permission, provided that you have set an existing user instance as the currently authenticated user using `Auth::login`. See [Gates](https://laravel.com/docs/11.x/authorization#gates) for more details.
|
||||||
|
|
||||||
|
```php
|
||||||
|
if(Gate::allows('enforcer', ['articles', 'read'])) {
|
||||||
|
// The user can read articles
|
||||||
|
};
|
||||||
|
```
|
||||||
|
|
||||||
### Multiple enforcers
|
### Multiple enforcers
|
||||||
|
|
||||||
If you need multiple permission controls in your project, you can configure multiple enforcers.
|
If you need multiple permission controls in your project, you can configure multiple enforcers.
|
||||||
|
|
|
@ -2,8 +2,10 @@
|
||||||
|
|
||||||
namespace Lauthz;
|
namespace Lauthz;
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Gate;
|
||||||
use Illuminate\Support\ServiceProvider;
|
use Illuminate\Support\ServiceProvider;
|
||||||
use Lauthz\Contracts\ModelLoader;
|
use Lauthz\Contracts\ModelLoader;
|
||||||
|
use Lauthz\Facades\Enforcer;
|
||||||
use Lauthz\Loaders\ModelLoaderFactory;
|
use Lauthz\Loaders\ModelLoaderFactory;
|
||||||
use Lauthz\Models\Rule;
|
use Lauthz\Models\Rule;
|
||||||
use Lauthz\Observers\RuleObserver;
|
use Lauthz\Observers\RuleObserver;
|
||||||
|
@ -56,5 +58,25 @@ class LauthzServiceProvider extends ServiceProvider
|
||||||
$this->app->bind(ModelLoader::class, function($app, $config) {
|
$this->app->bind(ModelLoader::class, function($app, $config) {
|
||||||
return ModelLoaderFactory::createFromConfig($config);
|
return ModelLoaderFactory::createFromConfig($config);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$this->registerGates();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a gate that allows users to use Laravel's built-in Gate to call Enforcer.
|
||||||
|
*
|
||||||
|
* @return void
|
||||||
|
*/
|
||||||
|
protected function registerGates()
|
||||||
|
{
|
||||||
|
Gate::define('enforcer', function ($user, ...$args) {
|
||||||
|
$identifier = $user->getAuthIdentifier();
|
||||||
|
if (method_exists($user, 'getAuthzIdentifier')) {
|
||||||
|
$identifier = $user->getAuthzIdentifier();
|
||||||
|
}
|
||||||
|
$identifier = strval($identifier);
|
||||||
|
|
||||||
|
return Enforcer::enforce($identifier, ...$args);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Lauthz\Tests;
|
||||||
|
|
||||||
|
use Illuminate\Foundation\Testing\DatabaseMigrations;
|
||||||
|
use Illuminate\Support\Facades\Gate;
|
||||||
|
|
||||||
|
class GatesAuthorizationTest extends TestCase
|
||||||
|
{
|
||||||
|
use DatabaseMigrations;
|
||||||
|
|
||||||
|
public function testNotLogin()
|
||||||
|
{
|
||||||
|
$this->assertFalse(Gate::allows('enforcer', ['data1', 'read']));
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testAfterLogin()
|
||||||
|
{
|
||||||
|
$this->login('alice');
|
||||||
|
$this->assertTrue(Gate::allows('enforcer', ['data1', 'read']));
|
||||||
|
$this->assertTrue(Gate::allows('enforcer', ['data2', 'read']));
|
||||||
|
$this->assertTrue(Gate::allows('enforcer', ['data2', 'write']));
|
||||||
|
|
||||||
|
$this->login('bob');
|
||||||
|
$this->assertFalse(Gate::allows('enforcer', ['data1', 'read']));
|
||||||
|
$this->assertTrue(Gate::allows('enforcer', ['data2', 'write']));
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue