On Tue, Aug 19, 2025 at 11:41:29AM -0400, Chaz Kettleson wrote:
> On Tue, Aug 19, 2025 at 05:21:54PM +0200, Jean-Baptiste Onofré wrote:
> > The Apache Karaf team is pleased to announce Apache Karaf runtime 4.4.8 
> > release.
> > 
> > Apache Karaf runtime 4.4.8 is a maintenance release, especially bringing:
> > * SecurityContext returns RolePrincipal instead of UserPrincipal in JAX-RS
> > * Several improvements on JAAS layer
> > * New BoM (light)
> > * Java26 support
> > * Full build using JDK11 (including javase 11 in the resolver)
> > * A bunch of dependency updates
> > 
> > You can take a look on the Release Notes for details:
> > https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12311140&version=12354828
> > 
> > You can download Apache Karaf runtime 4.4.8 here:
> > https://karaf.apache.org/download.html
> > 
> > Enjoy!
> > The Apache Karaf team
> 
> Hello,
> 
> I having trouble migrating to the new JAAS security changes. I am using
> the Karaf service guard in order to protect specific methods based on
> which role they have. This works fine for when logging in as a user.
> However, I also expose a REST service via CXF. Authentication is done
> through Shiro with Aries JAX-RS integration -- I then convert this Shiro
> authenticated user into a JAAS Subject using the Karaf UserPrincipal and
> RolePrincpal and intercept the calls running it in a SecurityContext.
> This allows the service guard to continue to work. The changes in 4.4.8
> break this for me. I'm having trouble figuring out what exactly I need
> to change to replicate the behavior. Any advice would be greatly
> appreciated.
> 
> Example:
> 
> import org.apache.karaf.jaas.boot.principal.RolePrincipal;
> import org.apache.karaf.jaas.boot.principal.UserPrincipal;
> 
>   public static Subject toJaasSubject(@NonNull final RichPrincipal 
> richPrincipal) {
>     final Set<Principal> principals = new HashSet<>();
> 
>     // Add the main user principal (identity) to the JAAS Subject
>     principals.add(new UserPrincipal(richPrincipal.name()));
> 
>     // Add roles as RolePrincipals
>     richPrincipal.roles().forEach(role -> principals.add(new 
> RolePrincipal(role)));
> 
>     // Add permissions as RolePrincipals (assuming permissions are handled 
> similarly)
>     richPrincipal
>         .permissions()
>         .forEach(permission -> principals.add(new RolePrincipal(permission)));
> 
>     // Construct the JAAS Subject with principals, no public/private 
> credentials
>     return new Subject(true, principals, Set.of(), Set.of());
>   }
> 
> and then there is a CXF interceptor which runs this in a
> Subject.call(do)As
> 
> public class JaasSubjectDoAsInterceptor extends 
> AbstractPhaseInterceptor<Message> {
> 
>   public JaasSubjectDoAsInterceptor() {
>     super(Phase.PRE_INVOKE);
>   }
> 
>   @Override
>   public void handleMessage(final Message message) {
>     final org.apache.shiro.subject.Subject shiroSubject = 
> SecurityUtils.getSubject();
>     if (shiroSubject == null
>         || !(shiroSubject.getPrincipal() instanceof RichPrincipal 
> userPrincipal)) {
>       return;
>     }
>     SecurityUtilities.runAs(
>         SecurityUtilities.toJaasSubject(userPrincipal),
>         () -> {
>           message.getInterceptorChain().doIntercept(message);
>           return null;
>         });
>   }
> 
> with this I can just @Reference my service and call the appropriate
> method associated with the REST endpoint and the service guard will
> ensure I have the right group. I have multiple Shiro Realm's I'm
> authenticating against (i.e. GitLab) and I convert the
> groups/permissions into karaf RolePrincipals for use with the below
> service guard ACL for example.
> 
> service.guard = (objectClass=com.example.MyService)
> 
> # Initially allow everything (needed for registration)
> * = *
> 
> # Objects
> getObject* = someGroup
> 
> V/r,
> 
> 
> -- 
> Chaz

All,

Please disregard. Further testing I confirmed this is _not_ an issue and
there was something in my environment causing an issue.

-- 
Chaz

Reply via email to