Skip to content

docs(sso): correct three Entra ID group resolution claims - #498

Merged
marevol merged 1 commit into
masterfrom
docs/entraid-nested-group-accuracy
Aug 16, 2026
Merged

docs(sso): correct three Entra ID group resolution claims#498
marevol merged 1 commit into
masterfrom
docs/entraid-nested-group-accuracy

Conversation

@marevol

@marevol marevol commented Aug 16, 2026

Copy link
Copy Markdown
Contributor

Verified against a live Entra ID tenant on Fess 15.8.0-SNAPSHOT (master 127f30b0a). All seven languages.

1. The "could not be fully loaded" message is not shown when the Graph permission is missing

The troubleshooting section says the message appears for "a user who holds their direct groups but not their parent groups". toMemberGroupIds treats Authorization_RequestDenied as an answer meaning the group has no parents rather than as a failure, so resolution counts as successful and nothing appears on the search screen.

That is the most likely cause of missing parent groups — the GroupMember.Read.All the previous bullet tells the reader to check — so the one case the text was written for is the one it gets wrong.

Measured: with only User.Read consented, a user went from six matching documents to three. No banner. The only sign was Not allowed to read the parent groups of ... in the log.

2. entraid.use.ds also removes a user-level permission

The table describes only the group and role effect. The local part of the signed-in user's user principal name is derived the same way, so false removes that permission too.

Measured: use.ds=false removed both 2FessTestM365 (the group mail local part) and 1fess-test1 (the UPN local part).

3. Nested groups are not walked recursively

The parent group lookup uses Microsoft Graph's getMemberGroups, which resolves transitively: one call per directly assigned group returns every group above it, whatever the depth.

Measured: a three-level nest resolved completely, and the log showed depth: 0 only — a single getMemberGroups response carried both the parent and the grandparent. "Recursively" and "up to a certain number of levels" describe machinery that does not engage while Graph is answering.

Also

entraid.permission.fields can only name a field whose value is a string. securityEnabled comes back as a boolean and groupTypes as a list, and neither can become a permission value. Naming one currently breaks group resolution outright; codelibs/fess#3296 makes it ignore the field with a warning instead.

Verification

Every file was parsed with docutils before and after: no new errors or warnings, and the new literals and emphasis parse as the intended nodes in all seven languages.

Verified against a live tenant on Fess 15.8.0-SNAPSHOT.

**The "could not be fully loaded" message is not shown when the Graph
permission is missing.** The troubleshooting section states that a user who
holds their direct groups but not their parent groups gets that message too.
`toMemberGroupIds` treats `Authorization_RequestDenied` as an answer meaning the
group has no parents rather than as a failure, so resolution counts as
successful and nothing appears on the search screen. That is the most likely
cause of missing parent groups -- the `GroupMember.Read.All` the previous
bullet tells the reader to check -- so the one case the text was written for is
the one it gets wrong. Signing in with only `User.Read` consented dropped a
user from six matching documents to three with no message at all; the only sign
was the `Not allowed to read the parent groups of ...` warning in the log.

**`entraid.use.ds` also removes a user-level permission.** The table describes
only the group and role effect. The local part of the signed-in user's user
principal name is derived the same way, so `false` removes that permission too.

**Nested groups are not walked recursively.** The parent group lookup uses
Microsoft Graph's `getMemberGroups`, which resolves transitively: one call per
directly assigned group returns every group above it, whatever the depth. A
three-level nest resolved completely with a single call and no recursion, so
"recursively" and "up to a certain number of levels" describe machinery that
does not engage while Graph is answering.

Also states that `entraid.permission.fields` can only name a field whose value
is a string -- `securityEnabled` and `groupTypes` come back as a boolean and a
list and cannot become permission values.

All seven languages.
@marevol
marevol merged commit 37e1004 into master Aug 16, 2026
2 checks passed
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.

1 participant