diff --git a/.env.example b/.env.example index 5bac6f8c..42341632 100644 --- a/.env.example +++ b/.env.example @@ -163,3 +163,6 @@ L5_SWAGGER_CONST_TOKEN_URL='/oauth2/token' # L5_FORMAT_TO_USE_FOR_DOCS=yaml L5_SWAGGER_GENERATE_ALWAYS=true # Dev setting L5_SWAGGER_OPEN_API_SPEC_VERSION=3.1.2 + +# Comma separated group slugs allowed to use the OAUTH2 Console (apps / grants). Empty = nobody. +OAUTH2_CONSOLE_ALLOWED_GROUPS= diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index d81fc8df..189e3332 100644 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -80,6 +80,8 @@ class Kernel extends HttpKernel 'oauth2.currentuser.serveradmin.json' => \App\Http\Middleware\CurrentUserIsOAuth2ServerAdminJson::class, 'openstackid.currentuser.serveradmin' => \App\Http\Middleware\CurrentUserIsOpenIdServerAdmin::class, 'openstackid.currentuser.serveradmin.json' => \App\Http\Middleware\CurrentUserIsOpenIdServerAdminJson::class, + 'oauth2.console.access' => \App\Http\Middleware\CurrentUserCanAccessOAuth2Console::class, + 'oauth2.console.access.json' => \App\Http\Middleware\CurrentUserCanAccessOAuth2ConsoleJson::class, 'oauth2.currentuser.allow.client.edition' => \App\Http\Middleware\CurrentUserCanEditOAuth2Client::class, 'oauth2.currentuser.owns.client' => \App\Http\Middleware\CurrentUserOwnsOAuth2Client::class, 'service.account' => \App\Http\Middleware\EnsureServiceAccount::class, diff --git a/app/Http/Middleware/CurrentUserCanAccessOAuth2Console.php b/app/Http/Middleware/CurrentUserCanAccessOAuth2Console.php new file mode 100644 index 00000000..a274b9a2 --- /dev/null +++ b/app/Http/Middleware/CurrentUserCanAccessOAuth2Console.php @@ -0,0 +1,44 @@ +guest()) + { + return Response::view('errors.404', [], 404); + } + if(!Auth::user()->canAccessOAuth2Console()) + { + return Response::view('errors.404', [], 404); + } + return $next($request); + } +} \ No newline at end of file diff --git a/app/Http/Middleware/CurrentUserCanAccessOAuth2ConsoleJson.php b/app/Http/Middleware/CurrentUserCanAccessOAuth2ConsoleJson.php new file mode 100644 index 00000000..8a10475f --- /dev/null +++ b/app/Http/Middleware/CurrentUserCanAccessOAuth2ConsoleJson.php @@ -0,0 +1,45 @@ +guest()) + { + return Response::json(array('error' => 'you are not allowed to perform this operation'), 403); + } + if(!Auth::user()->canAccessOAuth2Console()) + { + return Response::json(array('error' => 'you are not allowed to perform this operation'), 403); + } + + return $next($request); + } +} \ No newline at end of file diff --git a/app/libs/Auth/Models/User.php b/app/libs/Auth/Models/User.php index 5f407abb..9eed1518 100644 --- a/app/libs/Auth/Models/User.php +++ b/app/libs/Auth/Models/User.php @@ -677,6 +677,21 @@ public function isOAuth2ServerAdmin(): bool return $this->belongToGroup(IOAuth2User::OAuth2ServerAdminGroup); } + /** + * Access to the OAUTH2 Console is granted only to members of the groups + * listed in config('oauth2.console_allowed_groups'); empty list denies everybody. + * @return bool + */ + public function canAccessOAuth2Console(): bool + { + $allowed = Config::get('oauth2.console_allowed_groups', []); + if (!is_array($allowed)) return false; + foreach ($allowed as $slug) { + if (is_string($slug) && $slug !== '' && $this->belongToGroup($slug)) return true; + } + return false; + } + /** * @return bool */ diff --git a/config/oauth2.php b/config/oauth2.php index c8736d26..3e9fe33a 100644 --- a/config/oauth2.php +++ b/config/oauth2.php @@ -12,4 +12,16 @@ | */ 'validate_resource_server_ip' => env('OAUTH2_VALIDATE_RESOURCE_SERVER_IP', false), + + /* + |-------------------------------------------------------------------------- + | OAuth2 Console Allowed Groups + |-------------------------------------------------------------------------- + | + | Comma separated list of group slugs whose members can see the + | "OAUTH2 Console" menu and use /admin/clients, /admin/grants and the + | related admin API. If empty or unset, NOBODY has access (secure default). + | + */ + 'console_allowed_groups' => array_values(array_filter(array_map('trim', explode(',', (string)env('OAUTH2_CONSOLE_ALLOWED_GROUPS', ''))))), ]; diff --git a/resources/js/components/drawer/drawer.js b/resources/js/components/drawer/drawer.js index a2632edd..455cf60a 100644 --- a/resources/js/components/drawer/drawer.js +++ b/resources/js/components/drawer/drawer.js @@ -63,6 +63,7 @@ function DrawerComponent() { {menuConfig.settingsText} + {menuConfig.canAccessOAuth2Console && + {menuConfig.canAccessOAuth2Console && + <>