This is an automated email from the ASF dual-hosted git repository.

dineshkumar pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ranger.git


The following commit(s) were added to refs/heads/master by this push:
     new 5bc3cb303 RANGER-4371: Ranger authn - add doAs support for JWT 
authentication
5bc3cb303 is described below

commit 5bc3cb303e1100e25e7b45df1407b250e662bc77
Author: Kishor Gollapalliwar <[email protected]>
AuthorDate: Mon Aug 21 18:56:11 2023 +0530

    RANGER-4371: Ranger authn - add doAs support for JWT authentication
    
    Signed-off-by: Dineshkumar Yadav <[email protected]>
---
 .../handler/jwt/RangerDefaultJwtAuthHandler.java   |  4 +++-
 .../authz/handler/jwt/RangerJwtAuthHandler.java    | 22 ++++++++++++++++------
 2 files changed, 19 insertions(+), 7 deletions(-)

diff --git 
a/ranger-authn/src/main/java/org/apache/ranger/authz/handler/jwt/RangerDefaultJwtAuthHandler.java
 
b/ranger-authn/src/main/java/org/apache/ranger/authz/handler/jwt/RangerDefaultJwtAuthHandler.java
index c0d5b8d9a..85339fb16 100644
--- 
a/ranger-authn/src/main/java/org/apache/ranger/authz/handler/jwt/RangerDefaultJwtAuthHandler.java
+++ 
b/ranger-authn/src/main/java/org/apache/ranger/authz/handler/jwt/RangerDefaultJwtAuthHandler.java
@@ -40,6 +40,7 @@ import com.nimbusds.jwt.proc.JWTClaimsSetVerifier;
 public class RangerDefaultJwtAuthHandler extends RangerJwtAuthHandler {
 
     protected static final String AUTHORIZATION_HEADER = "Authorization";
+    protected static final String DO_AS_PARAMETER      = "doAs";
 
     @Override
     public ConfigurableJWTProcessor<SecurityContext> 
getJwtProcessor(JWSKeySelector<SecurityContext> keySelector) {
@@ -57,8 +58,9 @@ public class RangerDefaultJwtAuthHandler extends 
RangerJwtAuthHandler {
         RangerAuth rangerAuth       = null;
         String     jwtAuthHeaderStr = getJwtAuthHeader(httpServletRequest);
         String     jwtCookieStr     = StringUtils.isBlank(jwtAuthHeaderStr) ? 
getJwtCookie(httpServletRequest) : null;
+        String     doAsUser         = 
httpServletRequest.getParameter(DO_AS_PARAMETER);
 
-        AuthenticationToken authenticationToken = 
authenticate(jwtAuthHeaderStr, jwtCookieStr);
+        AuthenticationToken authenticationToken = 
authenticate(jwtAuthHeaderStr, jwtCookieStr, doAsUser);
 
         if (authenticationToken != null) {
             rangerAuth = new RangerAuth(authenticationToken, 
RangerAuth.AUTH_TYPE.JWT_JWKS);
diff --git 
a/ranger-authn/src/main/java/org/apache/ranger/authz/handler/jwt/RangerJwtAuthHandler.java
 
b/ranger-authn/src/main/java/org/apache/ranger/authz/handler/jwt/RangerJwtAuthHandler.java
index 0973b42de..17063cedf 100644
--- 
a/ranger-authn/src/main/java/org/apache/ranger/authz/handler/jwt/RangerJwtAuthHandler.java
+++ 
b/ranger-authn/src/main/java/org/apache/ranger/authz/handler/jwt/RangerJwtAuthHandler.java
@@ -101,7 +101,7 @@ public abstract class RangerJwtAuthHandler implements 
RangerAuthHandler {
         }
     }
 
-    protected AuthenticationToken authenticate(final String jwtAuthHeader, 
final String jwtCookie) {
+    protected AuthenticationToken authenticate(final String jwtAuthHeader, 
final String jwtCookie, final String doAsUser) {
         if (LOG.isDebugEnabled()) {
             LOG.debug("===>>> RangerJwtAuthHandler.authenticate()");
         }
@@ -115,17 +115,27 @@ public abstract class RangerJwtAuthHandler implements 
RangerAuthHandler {
                     final SignedJWT jwtToken = SignedJWT.parse(serializedJWT);
                     boolean         valid    = validateToken(jwtToken);
                     if (valid) {
-                        final String userName = 
jwtToken.getJWTClaimsSet().getSubject();
-                        LOG.info("Issuing AuthenticationToken for user: [{}]", 
userName);
+                        String userName;
+
+                        if (StringUtils.isNotBlank(doAsUser)) {
+                            userName = doAsUser.trim();
+                        } else {
+                            userName = jwtToken.getJWTClaimsSet().getSubject();
+                        }
+
+                        if (LOG.isDebugEnabled()) {
+                            LOG.debug("RangerJwtAuthHandler.authenticate(): 
Issuing AuthenticationToken for user: [{}]", userName);
+                            LOG.debug("RangerJwtAuthHandler.authenticate(): 
Authentication successful for user [{}] and doAs user is [{}]", 
jwtToken.getJWTClaimsSet().getSubject(), doAsUser);
+                        }
                         token = new AuthenticationToken(userName, userName, 
TYPE);
                     } else {
-                        LOG.warn("Validation failed for JWT token: [{}] ", 
jwtToken.serialize());
+                        LOG.warn("RangerJwtAuthHandler.authenticate(): 
Validation failed for JWT token: [{}] ", jwtToken.serialize());
                     }
                 } catch (ParseException pe) {
-                    LOG.warn("Unable to parse the JWT token", pe);
+                    LOG.warn("RangerJwtAuthHandler.authenticate(): Unable to 
parse the JWT token", pe);
                 }
             } else {
-                LOG.warn("JWT token not found.");
+                LOG.warn("RangerJwtAuthHandler.authenticate(): JWT token not 
found.");
             }
         }
 

Reply via email to