Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: use Laravel's built-in Manager class #72

Merged
merged 1 commit into from
Jul 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 3 additions & 2 deletions src/EnforcerManager.php
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@
use Casbin\Model\Model;
use Casbin\Log\Log;
use Lauthz\Contracts\Factory;
use Lauthz\Contracts\ModelLoader;
use Lauthz\Models\Rule;
use Illuminate\Support\Arr;
use InvalidArgumentException;
use Lauthz\Loaders\ModelLoaderManager;

/**
* @mixin \Casbin\Enforcer
Expand Down Expand Up @@ -87,7 +87,8 @@ protected function resolve($name)
}

$model = new Model();
$loader = $this->app->make(ModelLoader::class, $config);
$loader = $this->app->make(ModelLoaderManager::class);
$loader->initFromConfig($config);
leeqvip marked this conversation as resolved.
Show resolved Hide resolved
$loader->loadModel($model);

$adapter = Arr::get($config, 'adapter');
Expand Down
7 changes: 3 additions & 4 deletions src/LauthzServiceProvider.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,7 @@
namespace Lauthz;

use Illuminate\Support\ServiceProvider;
use Lauthz\Contracts\ModelLoader;
use Lauthz\Loaders\ModelLoaderFactory;
use Lauthz\Loaders\ModelLoaderManager;
use Lauthz\Models\Rule;
use Lauthz\Observers\RuleObserver;

Expand Down Expand Up @@ -53,8 +52,8 @@ public function register()
return new EnforcerManager($app);
});

$this->app->bind(ModelLoader::class, function($app, $config) {
return ModelLoaderFactory::createFromConfig($config);
$this->app->singleton(ModelLoaderManager::class, function ($app) {
return new ModelLoaderManager($app);
});
}
}
48 changes: 0 additions & 48 deletions src/Loaders/ModelLoaderFactory.php

This file was deleted.

108 changes: 108 additions & 0 deletions src/Loaders/ModelLoaderManager.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
<?php

namespace Lauthz\Loaders;

use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Illuminate\Support\Manager;
use InvalidArgumentException;

/**
* The model loader manager.
*
* A model loader is responsible for a loading model from an arbitrary source.
* Developers can customize loading behavior by implementing
* and register the custom loader in AppServiceProvider through `app(LoaderManager::class)->extend()`.
*
* Built-in loader implementations include:
* - FileLoader: For loading model from file.
* - TextLoader: Suitable for model defined as a multi-line string.
* - UrlLoader: Handles model loading from URL.
*
* To utilize a built-in or custom loader, set 'model.config_type' in the configuration to match one of the above types.
*/
class ModelLoaderManager extends Manager
{

/**
* The array of the lauthz driver configuration.
*
* @var array
*/
protected $config;

/**
* Initialize configuration for the loader manager instance.
*
* @param array $config the lauthz driver configuration.
*/
public function initFromConfig(array $config)
{
$this->config = $config;
}

/**
* Get the default driver from the configuration.
*
* @return string The default driver name.
*/
public function getDefaultDriver()
{
return Arr::get($this->config, 'model.config_type', '');
}

/**
* Create a new TextLoader instance.
*
* @return TextLoader
*/
public function createTextDriver()
{
return new TextLoader($this->config);
}

/**
* Create a new UrlLoader instance.
*
* @return UrlLoader
*/
public function createUrlDriver()
{
return new UrlLoader($this->config);
}

/**
* Create a new FileLoader instance.
*
* @return FileLoader
*/
public function createFileDriver()
{
return new FileLoader($this->config);
}

/**
* Create a new driver instance.
*
* @param string $driver
* @return mixed
*
* @throws \InvalidArgumentException
*/
protected function createDriver($driver)
{
if(empty($driver)) {
throw new InvalidArgumentException('Unsupported empty model loader type.');
}

if (isset($this->customCreators[$driver])) {
return $this->callCustomCreator($driver);
}
$method = 'create' . Str::studly($driver) . 'Driver';
if (method_exists($this, $method)) {
return $this->$method();
}

throw new InvalidArgumentException("Unsupported model loader type: {$driver}.");
}
}
2 changes: 1 addition & 1 deletion tests/DatabaseAdapterTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -309,7 +309,7 @@ public function testLoadFilteredPolicy()
$this->assertEquals([
['bob', 'data2', 'write']
], Enforcer::getPolicy());

// Filter
$filter = new Filter(['v2'], ['read']);
Enforcer::loadFilteredPolicy($filter);
Expand Down
25 changes: 21 additions & 4 deletions tests/ModelLoaderTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
namespace Lauthz\Tests;

use Lauthz\Facades\Enforcer;
use Lauthz\Loaders\ModelLoaderManager;
use InvalidArgumentException;
use RuntimeException;

Expand Down Expand Up @@ -67,7 +68,15 @@ public function testEmptyLoaderType(): void
$this->assertFalse(Enforcer::enforce('alice', 'data', 'read'));
}

public function testBadUlrConnection(): void
public function testNotExistLoaderType(): void
{
$this->app['config']->set('lauthz.basic.model.config_type', 'not_exist');
$this->expectException(InvalidArgumentException::class);

$this->assertFalse(Enforcer::enforce('alice', 'data', 'read'));
}

public function testBadUrlConnection(): void
{
$this->initUrlConfig();
$this->app['config']->set('lauthz.basic.model.config_url', 'http://filenoexists');
Expand All @@ -94,12 +103,20 @@ protected function initTextConfig(): void
);
}

protected function initCustomConfig(): void {
$this->app['config']->set('lauthz.second.model.config_loader_class', '\Lauthz\Loaders\TextLoader');
protected function initCustomConfig(): void
{
$this->app['config']->set('lauthz.second.model.config_type', 'custom');
$this->app['config']->set(
'lauthz.second.model.config_text',
$this->getModelText()
);

$config = $this->app['config']->get('lauthz.second');
$loader = $this->app->make(ModelLoaderManager::class);

$loader->extend('custom', function () use ($config) {
return new \Lauthz\Loaders\TextLoader($config);
});
}

protected function getModelText(): string
Expand All @@ -118,4 +135,4 @@ protected function getModelText(): string
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
EOT;
}
}
}
15 changes: 13 additions & 2 deletions tests/RequestMiddlewareTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use Lauthz\Middlewares\RequestMiddleware;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Http\Request;
use Lauthz\Facades\Enforcer;
use Lauthz\Models\Rule;

class RequestMiddlewareTest extends TestCase
Expand Down Expand Up @@ -34,11 +35,19 @@ public function testAfterLogin()
$this->assertEquals($this->middleware(Request::create('/foo1/123', 'PUT')), 'Unauthorized Exception');

$this->assertEquals($this->middleware(Request::create('/proxy', 'GET')), 'Unauthorized Exception');

Enforcer::guard('second')->addPolicy('alice', '/foo1/*', '(GET|POST)');

$this->assertEquals($this->middleware(Request::create('/foo1/123', 'GET'), 'second'), 200);
$this->assertEquals($this->middleware(Request::create('/foo1/123', 'POST'), 'second'), 200);
$this->assertEquals($this->middleware(Request::create('/foo1/123', 'PUT'), 'second'), 'Unauthorized Exception');

$this->assertEquals($this->middleware(Request::create('/proxy', 'GET'), 'second'), 'Unauthorized Exception');
}

protected function middleware($request)
protected function middleware($request, ...$guards)
{
return parent::runMiddleware(RequestMiddleware::class, $request);
return parent::runMiddleware(RequestMiddleware::class, $request, ...$guards);
}

protected function initConfig()
Expand All @@ -62,6 +71,8 @@ protected function initConfig()
m = g(r.sub, p.sub) && r.sub == p.sub && keyMatch2(r.obj, p.obj) && regexMatch(r.act, p.act)
EOT;
$this->app['config']->set('lauthz.basic.model.config_text', $text);
$this->app['config']->set('lauthz.second.model.config_type', 'text');
$this->app['config']->set('lauthz.second.model.config_text', $text);
}

protected function initTable()
Expand Down
Loading