Skip to content
Open
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
8 changes: 8 additions & 0 deletions docs/customization/route_config.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,14 @@ $routes->get('login', '\App\Controllers\Auth\LoginController::loginView');
$routes->get('register', '\App\Controllers\Auth\RegisterController::registerView');
```

If you only need a specific route (or a small set of routes), you can use the `only` option instead

```php
service('auth')->routes($routes, ['only' => ['login']]);
```

In this case, you must manage all other routes manually.

After customization, check your routes with the [spark routes](https://codeigniter.com/user_guide/incoming/routing.html#spark-routes) command.

## Change Namespace
Expand Down
8 changes: 8 additions & 0 deletions docs/quick_start_guide/using_session_auth.md
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,14 @@ $routes->get('login', '\App\Controllers\Auth\LoginController::loginView');
$routes->get('register', '\App\Controllers\Auth\RegisterController::registerView');
```

If you only need a specific route (or a small set of routes), you can use the `only` option instead

```php
service('auth')->routes($routes, ['only' => ['login']]);
```

In this case, you must manage all other routes manually.

Check your routes with the [spark routes](https://codeigniter.com/user_guide/incoming/routing.html#spark-routes)
command.

Expand Down
17 changes: 16 additions & 1 deletion src/Auth.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
use CodeIgniter\Shield\Config\Auth as AuthConfig;
use CodeIgniter\Shield\Entities\User;
use CodeIgniter\Shield\Models\UserModel;
use InvalidArgumentException;

/**
* Facade for Authentication
Expand Down Expand Up @@ -134,13 +135,27 @@ public function authenticate(array $credentials): Result
*/
public function routes(RouteCollection &$routes, array $config = []): void
{
if (isset($config['only'], $config['except'])) {
throw new InvalidArgumentException(
'The "only" and "except" options cannot be used at the same time.',
);
}

$authRoutes = config('AuthRoutes')->routes;

$namespace = $config['namespace'] ?? 'CodeIgniter\Shield\Controllers';

$routes->group('/', ['namespace' => $namespace], static function (RouteCollection $routes) use ($authRoutes, $config): void {
foreach ($authRoutes as $name => $row) {
if (! isset($config['except']) || ! in_array($name, $config['except'], true)) {
$shouldInclude = true;

if (isset($config['only'])) {
$shouldInclude = in_array($name, $config['only'], true);
} elseif (isset($config['except'])) {
$shouldInclude = ! in_array($name, $config['except'], true);
}

if ($shouldInclude) {
foreach ($row as $params) {
$options = isset($params[3])
? ['as' => $params[3]]
Expand Down
31 changes: 31 additions & 0 deletions tests/Unit/AuthRoutesTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
use CodeIgniter\CodeIgniter;
use CodeIgniter\Router\RouteCollection;
use CodeIgniter\Shield\Auth;
use InvalidArgumentException;
use Tests\Support\TestCase;

/**
Expand Down Expand Up @@ -65,6 +66,36 @@ public function testRoutesExcept(): void
$this->assertArrayHasKey('auth/a/show', $routes);
}

public function testRoutesOnly(): void
{
$collection = single_service('routes');
$auth = service('auth');

$auth->routes($collection, ['only' => ['login']]);

if (version_compare(CodeIgniter::CI_VERSION, '4.5') >= 0) {
$routes = $collection->getRoutes('GET');
} else {
$routes = $collection->getRoutes('get');
}

$this->assertArrayHasKey('login', $routes);
$this->assertArrayNotHasKey('register', $routes);
$this->assertArrayNotHasKey('login/magic-link', $routes);
$this->assertArrayNotHasKey('logout', $routes);
$this->assertArrayNotHasKey('auth/a/show', $routes);
}

public function testRoutesUseOnlyAndExceptOptionsSimultaneous(): void
{
$this->expectException(InvalidArgumentException::class);

$collection = single_service('routes');
$auth = service('auth');

$auth->routes($collection, ['only' => ['login'], 'except' => ['register']]);
}

public function testRoutesCustomNamespace(): void
{
$collection = single_service('routes');
Expand Down
Loading