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

[4.x] Allow roles and groups to be database driven #5686

Merged

Conversation

ryanmitchell
Copy link
Contributor

@ryanmitchell ryanmitchell commented Mar 29, 2022

This PR follows on from the eloquent all models PR by allowing the user roles and groups to be stored in the database.

I appreciate that not every install would want this as they may be using Spatie permissions or some other roles library, but it feels like the option should be there at least for the roles and groups to be eloquent driven on a vanilla Statamic install.

If you'd be happy with the approach I've taken and open to merging it in principle then I'll start into writing the tests required to ensure coverage.

Closes #5986

@jasonvarga
Copy link
Member

Yep, absolutely a good idea. However it should be an option, not a requirement.

@ryanmitchell
Copy link
Contributor Author

That’s fair, should I put it behind a config flag? So if the roles/groups tables are falsey then it reverts to how it was before?

@jasonvarga
Copy link
Member

Yeah I think that'll work. Just gotta be aware of how it works if the keys are missing from the tables array. Existing users will not have them.

    'tables' => [
         'users' => 'users',
         'role_user' => 'role_user',
         'roles' => 'roles', // wont be there at all
         'group_user' => 'group_user',
         'groups' => 'groups', // wont be there at all
     ],

@jasonvarga jasonvarga marked this pull request as draft March 29, 2022 15:27
@jasonvarga jasonvarga changed the title Feature: Allow roles and groups to be database driven Allow roles and groups to be database driven Mar 29, 2022
@ryanmitchell
Copy link
Contributor Author

I've pushed a couple of updates that make it opt-in based on the config value. Do you mind checking them over to make sure this approach works for you?

I'll have a go at the tests tomorrow.

@ryanmitchell
Copy link
Contributor Author

ryanmitchell commented Mar 30, 2022

Ok I've added some tests here to cover adding groups/roles to users and removing them again. I had to make some changes to the existing eloquent user test, and the auth migration.

So you'll see I've added a new param to the auth migration (--test) which if present fixes the timestamp generated so it overwrites the files each time. Without that I was getting a class name already exists error as every migration generation was creating a new file.

Then I've made the eloquent user test (and groups/roles) run the migration as there was a todo mentioning that needed changed.

I also modified the down() migration to support sqlite.

Tests are working fine now for me locally, but failing here in GitHub as doctrine/dbal needs added to the test runner.

Can you take a look and see what you think of these changes?

edit: I added doctrine/dbal to require-dev and as you can see tests are now passing.

@ryanmitchell ryanmitchell marked this pull request as ready for review March 31, 2022 07:53
@abhishekvijayan-zessta
Copy link

abhishekvijayan-zessta commented May 5, 2022

If we use this PR, will the roles.yaml file gets updated when we change the role permissions?

@ryanmitchell
Copy link
Contributor Author

@abhishekvijayan-zessta no. They will be stored in the database.

@abhishekvijayan-zessta
Copy link

In my users.php I used eloquent as a repository. but even my roles.php gets updated while adding permissions to roles
image

@ryanmitchell
Copy link
Contributor Author

You need to specify tables for your roles/groups here:

cms/config/users.php

Lines 109 to 111 in 22ab699

'roles' => false,
'group_user' => 'group_user',
'groups' => false,

@shawinigan
Copy link

We found an issue in the User Groups list. It's trying to request the user group with the handle instead of the id. You should add
in Statamic\Auth\Eloquent\UserGroup.php a function id that will return the ID instead of the handle.
PR Screenshot

@ryanmitchell
Copy link
Contributor Author

@shawinigan can you share the full stack trace please?

@shawinigan
Copy link

@shawinigan can you share the full stack trace please?

Here it is

previous exception] [object] (PDOException(code: 22P02): SQLSTATE[22P02]: Invalid text representation: 7 ERREUR: syntaxe en entrée invalide pour le type bigint : « GreffeOrdisTous » CONTEXT: paramètre de portail non nommé $1 = '...' at C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php:421) [stacktrace] #0 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php(421): PDOStatement->execute() #1 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php(809): Illuminate\\Database\\Connection->Illuminate\\Database\\{closure}('select \"user_id...', Array) #2 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php(776): Illuminate\\Database\\Connection->runQueryCallback('select \"user_id...', Array, Object(Closure)) #3 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Connection.php(424): Illuminate\\Database\\Connection->run('select \"user_id...', Array, Object(Closure)) #4 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Query\\Builder.php(2752): Illuminate\\Database\\Connection->select('select \"user_id...', Array, true) #5 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Query\\Builder.php(2980): Illuminate\\Database\\Query\\Builder->runSelect() #6 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Query\\Builder.php(3294): Illuminate\\Database\\Query\\Builder->Illuminate\\Database\\Query\\{closure}() #7 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Database\\Query\\Builder.php(2982): Illuminate\\Database\\Query\\Builder->onceWithColumns(Array, Object(Closure)) #8 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Auth\\Eloquent\\UserGroup.php(54): Illuminate\\Database\\Query\\Builder->pluck('user_id') #9 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Auth\\Eloquent\\UserGroup.php(46): Statamic\\Auth\\Eloquent\\UserGroup->getUserIds() #10 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Auth\\UserGroup.php(70): Statamic\\Auth\\Eloquent\\UserGroup->queryUsers() #11 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Controllers\\CP\\Users\\UserGroupsController.php(29): Statamic\\Auth\\UserGroup->users() #12 [internal function]: Statamic\\Http\\Controllers\\CP\\Users\\UserGroupsController->Statamic\\Http\\Controllers\\CP\\Users\\{closure}(Object(Statamic\\Auth\\Eloquent\\UserGroup), 0) #13 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Collections\\Arr.php(560): array_map(Object(Closure), Array, Array) #14 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Collections\\Collection.php(777): Illuminate\\Support\\Arr::map(Array, Object(Closure)) #15 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Controllers\\CP\\Users\\UserGroupsController.php(35): Illuminate\\Support\\Collection->map(Object(Closure)) #16 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Controller.php(54): Statamic\\Http\\Controllers\\CP\\Users\\UserGroupsController->index(Object(Illuminate\\Http\\Request)) #17 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\ControllerDispatcher.php(43): Illuminate\\Routing\\Controller->callAction('index', Array) #18 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php(260): Illuminate\\Routing\\ControllerDispatcher->dispatch(Object(Illuminate\\Routing\\Route), Object(Statamic\\Http\\Controllers\\CP\\Users\\UserGroupsController), 'index') #19 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Route.php(205): Illuminate\\Routing\\Route->runController() #20 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(806): Illuminate\\Routing\\Route->run() #21 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(141): Illuminate\\Routing\\Router->Illuminate\\Routing\\{closure}(Object(Illuminate\\Http\\Request)) #22 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\RequireStatamicPro.php(17): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #23 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\RequireStatamicPro->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #24 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\DeleteTemporaryFileUploads.php(18): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #25 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\DeleteTemporaryFileUploads->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #26 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\CP\\CountUsers.php(18): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #27 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\CP\\CountUsers->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #28 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\CP\\BootUtilities.php(14): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #29 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\CP\\BootUtilities->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #30 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\CP\\BootPreferences.php(14): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #31 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\CP\\BootPreferences->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #32 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\CP\\BootPermissions.php(14): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #33 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\CP\\BootPermissions->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #34 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\CP\\SelectedSite.php(15): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #35 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\CP\\SelectedSite->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #36 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\CP\\Localize.php(19): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #37 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\CP\\Localize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #38 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\CP\\Authorize.php(25): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #39 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\CP\\Authorize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #40 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\CP\\AddToasts.php(22): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #41 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\CP\\AddToasts->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #42 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\CP\\AuthGuard.php(14): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #43 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\CP\\AuthGuard->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #44 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\CP\\ContactOutpost.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #45 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\CP\\ContactOutpost->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #46 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Middleware\\SubstituteBindings.php(50): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #47 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Routing\\Middleware\\SubstituteBindings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #48 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken.php(78): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #49 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\VerifyCsrfToken->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #50 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\View\\Middleware\\ShareErrorsFromSession.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #51 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\View\\Middleware\\ShareErrorsFromSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #52 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Session\\Middleware\\StartSession.php(121): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #53 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Session\\Middleware\\StartSession.php(64): Illuminate\\Session\\Middleware\\StartSession->handleStatefulRequest(Object(Illuminate\\Http\\Request), Object(Illuminate\\Session\\Store), Object(Closure)) #54 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Session\\Middleware\\StartSession->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #55 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse.php(37): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #56 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Cookie\\Middleware\\AddQueuedCookiesToResponse->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #57 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Cookie\\Middleware\\EncryptCookies.php(67): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #58 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Cookie\\Middleware\\EncryptCookies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #59 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\SwapExceptionHandler.php(19): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #60 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\SwapExceptionHandler->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #61 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #62 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(807): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) #63 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(784): Illuminate\\Routing\\Router->runRouteWithinStack(Object(Illuminate\\Routing\\Route), Object(Illuminate\\Http\\Request)) #64 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(748): Illuminate\\Routing\\Router->runRoute(Object(Illuminate\\Http\\Request), Object(Illuminate\\Routing\\Route)) #65 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Routing\\Router.php(737): Illuminate\\Routing\\Router->dispatchToRoute(Object(Illuminate\\Http\\Request)) #66 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(200): Illuminate\\Routing\\Router->dispatch(Object(Illuminate\\Http\\Request)) #67 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(141): Illuminate\\Foundation\\Http\\Kernel->Illuminate\\Foundation\\Http\\{closure}(Object(Illuminate\\Http\\Request)) #68 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\StopImpersonating.php(12): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #69 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\StopImpersonating->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #70 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\DisableFloc.php(17): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #71 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\DisableFloc->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #72 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\CheckMultisite.php(14): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #73 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\CheckMultisite->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #74 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\CheckComposerJsonScripts.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #75 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\CheckComposerJsonScripts->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #76 C:\\Users\\pguillemette\\www\\statamic\\vendor\\statamic\\cms\\src\\Http\\Middleware\\PoweredByHeader.php(18): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #77 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Statamic\\Http\\Middleware\\PoweredByHeader->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #78 C:\\Users\\pguillemette\\www\\statamic\\vendor\\barryvdh\\laravel-debugbar\\src\\Middleware\\InjectDebugbar.php(59): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #79 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Barryvdh\\Debugbar\\Middleware\\InjectDebugbar->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #80 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #81 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull.php(31): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #82 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ConvertEmptyStringsToNull->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #83 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest.php(21): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #84 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\TrimStrings.php(40): Illuminate\\Foundation\\Http\\Middleware\\TransformsRequest->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #85 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\TrimStrings->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #86 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize.php(27): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #87 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\ValidatePostSize->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #88 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance.php(99): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #89 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Foundation\\Http\\Middleware\\PreventRequestsDuringMaintenance->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #90 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Middleware\\HandleCors.php(49): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #91 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Http\\Middleware\\HandleCors->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #92 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Http\\Middleware\\TrustProxies.php(39): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #93 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(180): Illuminate\\Http\\Middleware\\TrustProxies->handle(Object(Illuminate\\Http\\Request), Object(Closure)) #94 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Pipeline\\Pipeline.php(116): Illuminate\\Pipeline\\Pipeline->Illuminate\\Pipeline\\{closure}(Object(Illuminate\\Http\\Request)) #95 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(175): Illuminate\\Pipeline\\Pipeline->then(Object(Closure)) #96 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\Http\\Kernel.php(144): Illuminate\\Foundation\\Http\\Kernel->sendRequestThroughRouter(Object(Illuminate\\Http\\Request)) #97 C:\\Users\\pguillemette\\www\\statamic\\public\\index.php(52): Illuminate\\Foundation\\Http\\Kernel->handle(Object(Illuminate\\Http\\Request)) #98 C:\\Users\\pguillemette\\www\\statamic\\vendor\\laravel\\framework\\src\\Illuminate\\Foundation\\resources\\server.php(16): require_once('C:\\\\Users\\\\pguill...') #99 {main} "}

@ryanmitchell
Copy link
Contributor Author

@shawinigan I'm not seeing that on a clean install.

We've already made it possible to query by string/handle - see:
https://github.com/ryanmitchell/cms/blob/bdcace944a85f1d3c1c631a48fd5c1e4ff8cc35b/src/Auth/Eloquent/UserGroupRepository.php#L73-L77

@shawinigan
Copy link

shawinigan commented Dec 8, 2023

@shawinigan can you share the full stack trace please?

The issue seems to be with the getUserIds function in the UserGroup file. We also don't have the error on an empty DB but when we add our users and associate them to groups, we've got the issue

@ryanmitchell
Copy link
Contributor Author

@shawinigan are you definitely using the migrations provided by this PR - the group_id is a varchar, not a bigint.
See: https://github.com/statamic/cms/pull/5686/files#diff-ffd886787bc27ac9182ddba3f29f4b0d8811f634ef885803dd9c97e023873b36R26

@shawinigan
Copy link

@shawinigan are you definitely using the migrations provided by this PR - the group_id is a varchar, not a bigint. See: https://github.com/statamic/cms/pull/5686/files#diff-ffd886787bc27ac9182ddba3f29f4b0d8811f634ef885803dd9c97e023873b36R26

I changed it because I was having another issue when importing my groups through SCIM. If I change it back to varchar, I don't get the error but the Users column in the list is displaying all zeros instead of the right number. I do get the right number when I create a function id in the UserGroup.php file returning the id instead of the handle.

@ryanmitchell
Copy link
Contributor Author

Im not able to replicate, see attached screen grabs. It sounds like you're making changes beyond what the PR is intended for.

CleanShot 2023-12-08 at 14 47 14@2x

CleanShot 2023-12-08 at 14 47 05@2x

@shawinigan
Copy link

Is it possible the issue is happening only with Postgres ? is_int return false in the find function. If I change it to is_numeric, it return true.

@ryanmitchell
Copy link
Contributor Author

@shawinigan I don't mind changing it to is_numeric - I've updated it.

@shawinigan
Copy link

It's working greaat with the is_numeric instead of the is_int but the users count still stay at 0 on the group list. The id() function return an handle instead of an id. We can't seems to find what the problem is

@ryanmitchell
Copy link
Contributor Author

@shawinigan i get a count ok

CleanShot 2023-12-11 at 14 21 37@2x

@shawinigan
Copy link

Are you using the ids in the group table or you are using uuids ? We didn't changed anything in the code. I twill probably be the reason we will have to forget using statamic unfortunately. The tables are ok, we don't understant why we can't get a count right and why you are getting it right

@ryanmitchell
Copy link
Contributor Author

@shawinigan I'm using this migrations this PR provides, so groups use bigint ids but group_user and role_user are linked by the handle not the id, as Statamic expects. If you are sure you havent changed anything, and have a Statamic license, you should email Statamic support and give them access to your site so they can investigate further.

@jasonvarga jasonvarga merged commit 96aa7ea into statamic:4.x Jan 23, 2024
18 checks passed
@ryanmitchell ryanmitchell deleted the feature/eloquent-roles-and-groups branch January 23, 2024 20:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Unable to update roles.yaml file in laravel vapor
10 participants