Hi Mike,

Thanks for the historical context, that is really helpful. And I completely
agree with your last paragraph, and especially this:

My preference would be to make this an immutable class that has the
> principal entity and all active principal roles all in the constructor.


I was arriving at the exact same conclusion – it's a pity that
SecurityContext doesn't expose the principal roles. I guess, the problem
now is how to move forward with this suggestion – I imagine a change
in AuthenticatedPolarisPrincipal or in the Resolver would create
repercussions in a lot of places in the code base as well as in existing
PRs.

Thanks,

Alex

On Mon, Apr 21, 2025 at 10:30 PM Michael Collado <collado.m...@gmail.com>
wrote:

> Hey
>
> 1. I'm unsure why the Resolver was written to assume no role means all
> roles. But I think it has to do with
> 2. The Resolver was intended to be able to resolve principal roles, grants,
> and target entities all at one "snapshot" based on the entity and grant
> versions returned by that loadEntitiesChangeTracking method. In order to do
> this in one shot, the authenticator couldn't resolve the principal roles
> actually granted to the principal, so it didn't resolve the
> PRINCIPAL_ROLE:ALL scope in the token. But that meant the Resolver needed
> to verify the grants existed for the roles to be assumed by the principal
> (otherwise, a caller could just put whatever role they want in the scope).
> To avoid the lookup during authn, ALL needed to be expanded by the Resolver
> based on the grants. This was an impedance to the federated role proposal,
> which stated that the authn token is authoritative regarding which roles
> are granted to the principal (e.g., using a groups claim
> <
> https://developer.okta.com/docs/guides/customize-tokens-groups-claim/main/
> >).
> That's why
> 3. I added the ActiveRolesProvider interface so that the default impl would
> continue to validate the grants held by the principal for activating
> principal roles but the federated alternative would delegate to the token
> claims (yet to be committed).
>
> Hopefully, that history helps. In short, I agree that
> SecurityIdentity.getRoles() should be the right way to determine activated
> principal roles. The Resolver should rely on the authenticator to determine
> the active set of principal roles and not rely on grant records. The
> AuthenticatedPolarisPrincipal doesn't really need to hold role names
> anymore, but the resolver does still need the list of active PrincipalRoles
> to load the appropriate catalog roles. My preference would be to make this
> an immutable class that has the principal entity and all active principal
> roles all in the constructor.
>
> Mike
>
> On Sun, Apr 20, 2025 at 8:34 AM Alex Dutra <alex.du...@dremio.com.invalid>
> wrote:
>
> > Hi Mike,
> >
> > I am generally fine with the spec changes.
> >
> > I have however some concerns around the way we handle principal roles
> today
> > in Polaris, and as I was preparing the PR with support for external IDPs
> > [1], some oddities stood out:
> >
> >    1. The pseudo-role PRINCIPAL_ROLE:ALL seems, by convention, to be
> >    converted to an empty set of roles by the Authenticator; but I wonder
> >    how we will be able to distinguish a token that contained no role
> from a
> >    token that contained the pseudo-role. I added some changes to my PR to
> > be
> >    able to distinguish the two situations, but I think the general
> > handling of
> >    this pseudo-role, as well as role mapping in general, deserves some
> more
> >    thinking. The spec says this pseudo-role is "non-functional" – but I
> > don't
> >    know what this implies exactly.
> >    2. AuthenticatedPolarisPrincipal exposes principal roles and this is
> >    imho concerning for two reasons: first, the Resolver seems to update
> the
> >    principal roles during resolution, which makes the class mutable,
> >    potentially changing the principal characteristics *after*
> > authentication.
> >    And secondly, this creates an ambiguity as roles can be accessed in
> two
> >    ways: SecurityIdentity.getRoles() vs
> >    AuthenticatedPolarisPrincipal.getActivatedPrincipalRoles(). I would be
> >    in favor of using the former consistently and completely removing the
> >    latter. (Note: SecurityContext.isUserInRole() relies on the former.)
> >    3. There seems to be some overlap between the primary roles
> resolution,
> >    done by the ActiveRolesProvider, and the role resolution done later by
> >    the Resolver, cf. method resolveCallerPrincipalAndPrincipalRoles(). I
> >    wonder if this second role resolution is really necessary? Ultimately,
> > the
> >    source of truth for role membership will always be
> >    SecurityIdentity.hasRole() or its JAX-RS variant,
> >    SecurityContext.isUserInRole(). We should not deviate from that.
> >
> > Thanks,
> >
> > Alex
> >
> > [1] https://github.com/apache/polaris/pull/1397
> >
> > On Sat, Apr 19, 2025 at 2:47 AM Dmitri Bourlatchkov <di...@apache.org>
> > wrote:
> >
> > > Re 2: Thanks for the clarification, Mike! I guess my brain swapped out
> a
> > > large portion of that doc :)
> > >
> > > I'm still not sure how IdentityToPrincipalMapping can help with
> resolving
> > > changes from API and from IdP integration.
> > >
> > > The doc talks about namespaces, but in PR# 1353, it looks like API
> calls
> > > are free to change anything in federated principal roles.
> > >
> > > Should IdentityToPrincipalMapping extend to validating changes coming
> > from
> > > the Admin API?
> > >
> > > Alternatively, we could treat that as a new permission and allow all
> > admin
> > > users to edit federated roles via API.
> > >
> > > Re 1: Yes, I guess it would be helpful with SCIM, but then we'd need to
> > > sync role membership, I guess.
> > >
> > > My understanding so far was that we'd get role membership at
> > authentication
> > > time and not persist it in Polaris.
> > >
> > > Is that still the plan?
> > >
> > > I think this relates to how we connect authentication and authorization
> > in
> > > Polaris. If Principals are external, we get role membership from the
> > access
> > > token and all is clear. If Principals are local, and we still get roles
> > > from the access token, then the question arises about whether that data
> > is
> > > in sync with local data (and the other way around too).
> > >
> > > That could be resolved by Polaris owning access tokens (via token
> > exchange)
> > > and assuming control over role membership based on local data and
> access
> > > time (I commented on this in the doc too).
> > >
> > > All in all, since SCIM is not part of phase 1 here, maybe we could
> defer
> > > dealing with federated Principal persistence, indeed.
> > >
> > > Re 3: I guess it also applies to client secret generation code, but
> let's
> > > see whether it actually causes too many conditions in code when it
> comes
> > to
> > > that.
> > >
> > > Cheers,
> > > Dmitri.
> > >
> > > On Thu, Apr 17, 2025 at 7:42 PM Michael Collado <
> collado.m...@gmail.com>
> > > wrote:
> > >
> > > > Thanks for the response.
> > > >
> > > > 1. TBH, I have no strong feelings about persisting the federated
> > > > principals. I think the biggest advantage I saw was to support SCIM
> > along
> > > > with 3p identity providers. But for this implementation, if we want
> to
> > > skip
> > > > persisting principal entities, I'm ok with it.
> > > >
> > > > 2. In the doc I wrote the following, which I think addresses the
> > concern
> > > > around conflicts.
> > > >
> > > >    1.
> > > >
> > > >    The IdentityToPrincipalMapping should supply a naming convention
> so
> > > that
> > > >    PrincipalRoles and Principals created from that source do not
> > conflict
> > > > with
> > > >    entities created by a different IdentityProvider
> > > >
> > > > In the case that a role happens to exist even with the naming
> > convention
> > > > applied, the caller would be unable to authenticate with that role.
> > > >
> > > > 3. I don't think we need special classes for federated roles. In
> nearly
> > > all
> > > > of the Polaris code, they are treated as PolarisRoleEntity without
> any
> > > > issue. The only code that needs to be aware of federated roles is
> > > >
> > > > a) The Admin API, which prevents granting these roles to principals
> and
> > > >
> > > > b) The federated roles provider, which verifies that the federated
> > > > principal is assuming federated roles.
> > > >
> > > > The rest of the code (i.e., the resolver and authorizer) treat these
> > > roles
> > > > exactly as native Polaris roles.
> > > >
> > > > Mike
> > > >
> > > > On Thu, Apr 17, 2025 at 2:39 PM Dmitri Bourlatchkov <
> di...@apache.org>
> > > > wrote:
> > > >
> > > > > Thanks for reviving this discussion, Mike!
> > > > >
> > > > > The API spec change by itself LGTM, but I have related concerns in
> > how
> > > > this
> > > > > feature is meant to work in general.
> > > > >
> > > > > 1) The need to expose Federated Principals in Polaris API.
> > > > >
> > > > > The design doc [1] discusses the possibility to expose Federated
> > > > Principals
> > > > > in Polaris API, but there are pros and cons. I do not think it is a
> > > > trivial
> > > > > decision. I'd like to discuss this in more detail before we commit
> to
> > > > doing
> > > > > that.
> > > > >
> > > > > From my POV the main benefit of exposing Federated Principals is to
> > be
> > > > able
> > > > > to alter their properties in Polaris (as mentioned in the doc).
> > > However,
> > > > > your email indicates that this is actually forbidden.
> > > > >
> > > > > What use cases do you envision for exposing read-only Federated
> > > > Principals?
> > > > >
> > > > > 2) Reconciliation of Federated vs. Non-Federated changes.
> > > > >
> > > > > Let's focus on Principal Roles here (which are meant to be writable
> > via
> > > > > API).
> > > > >
> > > > > If users are able to make and change (I assume) Principal Roles via
> > > API,
> > > > > and federation code will also be creating and changing those roles,
> > > what
> > > > is
> > > > > our approach to handling conflicts between those two streams of
> > > changes?
> > > > >
> > > > > Some examples for context (also mentioned in GH):
> > > > >
> > > > > A) A user creates normal Principal Role "A", and later role "A" is
> > > > > discovered through Federation.
> > > > >
> > > > > B) A user edits Federated Role "B" and later properties of "B" are
> > > > updated
> > > > > through Federation (or the other way around).
> > > > >
> > > > > Do we want to control property edits based on the origin of the
> > > property
> > > > > (spec out a "namespace" for Federated properties)?
> > > > >
> > > > > 3) OO types
> > > > >
> > > > > Currently Principals and Principal Roles are represented by one
> java
> > > type
> > > > > each. When federation comes into play, would it make sense to
> > develop a
> > > > > (java) type hierarchy for working with that data in Polaris code?
> My
> > > main
> > > > > concern here is avoiding a maze of if/else statements throughout
> the
> > > > > Polaris codebase for supporting Federation.
> > > > >
> > > > > I guess our approach to this depends largely on the outcome of
> topic
> > 2
> > > > > above.
> > > > >
> > > > > WDYT?
> > > > >
> > > > > Thanks,
> > > > > Dmitri.
> > > > >
> > > > > [1]
> > > > >
> > > > >
> > > >
> > >
> >
> https://docs.google.com/document/d/15_3ZiRB6Lhzw0nxij341QUdxEIyFGTrI9_18bFIyJVo/edit?tab=t.0#heading=h.cu1a1acu4lc5
> > > > >
> > > > > On Wed, Apr 16, 2025 at 6:44 PM Michael Collado <
> > > collado.m...@gmail.com>
> > > > > wrote:
> > > > >
> > > > > > Hey folks
> > > > > >
> > > > > > Some of you already know that I posted an initial PR to get
> > federated
> > > > > > principals/roles added. One thing that came out of the feedback
> > was a
> > > > > spec
> > > > > > change to make it clear when federated identities can be used in
> > the
> > > > > APIs.
> > > > > > Notably, federated principals cannot be created or updated, but
> can
> > > be
> > > > > > returned in get/list calls, whereas federated roles *can* be
> > created
> > > by
> > > > > the
> > > > > > API. The latter is useful/necessary in order to be able to assign
> > > > > > privileges to those roles without relying on the JIT creation on
> > > login.
> > > > > >
> > > > > > Please check out the spec change here and let me know what you
> > think
> > > -
> > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> https://github.com/apache/polaris/pull/1353/files#diff-52444bc79608edfae86ed0b46d171f7ef63c20090860d877e4e135168311a986
> > > > > >
> > > > > > Mike
> > > > > >
> > > > > > On Tue, Dec 17, 2024 at 5:15 PM Dmitri Bourlatchkov
> > > > > > <dmitri.bourlatch...@dremio.com.invalid> wrote:
> > > > > >
> > > > > > > Hi Mike,
> > > > > > >
> > > > > > > I left some comments in the doc, but overall it looks good to
> me
> > :)
> > > > > > >
> > > > > > > I still think there are some hidden dependencies on
> Persistence.
> > > For
> > > > > > > example, whether and how we can have composite keys for
> persisted
> > > > > > federated
> > > > > > > entities... but I guess we can work that out later.
> > > > > > >
> > > > > > > Also, I think it is important for the Authorizer API to avoid
> > > > assuming
> > > > > > that
> > > > > > > all principals are persisted. Specific authorizer
> implementations
> > > > > > > (including the default one) can certainly expect persisted
> > > > principals,
> > > > > > but
> > > > > > > the API should require that for the sake of flexibility of
> > possible
> > > > > > AuthN/Z
> > > > > > > extensions. WDYT?
> > > > > > >
> > > > > > > Cheers,
> > > > > > > Dmitri.
> > > > > > >
> > > > > > > On Thu, Nov 14, 2024 at 7:43 PM Michael Collado <
> > > > > collado.m...@gmail.com>
> > > > > > > wrote:
> > > > > > >
> > > > > > > > Hey folks
> > > > > > > >
> > > > > > > > As discussed during the community sync, I've put together
> some
> > > > > thoughts
> > > > > > > on
> > > > > > > > how we'd add support for federated identities in Polaris. I
> > > copied
> > > > > over
> > > > > > > > some of what I had in the issue at
> > > > > > > > https://github.com/apache/polaris/issues/441 and put it into
> > the
> > > > doc
> > > > > > > here:
> > > > > > > >
> > > > > > > >
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
> https://docs.google.com/document/d/15_3ZiRB6Lhzw0nxij341QUdxEIyFGTrI9_18bFIyJVo/edit?tab=t.0
> > > > > > > > .
> > > > > > > >
> > > > > > > > Please take a look when you get some time and let me know
> what
> > > you
> > > > > > think.
> > > > > > > > Given that our next community sync is scheduled for the
> > > > Thanksgiving
> > > > > > > > holiday in the US, it might be useful to schedule a meeting
> > > > > > specifically
> > > > > > > > for this. I can schedule that sync if needed.
> > > > > > > >
> > > > > > > > Mike
> > > > > > > >
> > > > > > >
> > > > > >
> > > > >
> > > >
> > >
> >
>

Reply via email to