Author: tripod
Date: Fri Mar 21 22:57:40 2014
New Revision: 1580079

URL: http://svn.apache.org/r1580079
Log:
OAK-1596 Provide mechanism for pre authenticated shared credentials

Added:
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/PreAuthenticatedLogin.java
Modified:
    
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/LoginModuleImpl.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/UserAuthentication.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/AbstractLoginModule.java
    
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/package-info.java

Modified: 
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java?rev=1580079&r1=1580078&r2=1580079&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-auth-external/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/external/impl/ExternalLoginModule.java
 Fri Mar 21 22:57:40 2014
@@ -37,6 +37,7 @@ import org.apache.jackrabbit.oak.spi.sec
 import 
org.apache.jackrabbit.oak.spi.security.authentication.AbstractLoginModule;
 import org.apache.jackrabbit.oak.spi.security.authentication.AuthInfoImpl;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.ImpersonationCredentials;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.PreAuthenticatedLogin;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityException;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityProvider;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.external.ExternalIdentityProviderManager;
@@ -160,15 +161,21 @@ public class ExternalLoginModule extends
         if (idp == null || syncHandler == null) {
             return false;
         }
-
         credentials = getCredentials();
-        if (credentials == null) {
+
+        // check if we have a pre authenticated login from a previous login 
module
+        final String userId;
+        final PreAuthenticatedLogin preAuthLogin = getSharedPreAuthLogin();
+        if (preAuthLogin != null) {
+            userId = preAuthLogin.getUserId();
+        } else {
+            userId = credentials instanceof SimpleCredentials ? 
((SimpleCredentials) credentials).getUserID() : null;
+        }
+        if (userId == null && credentials == null) {
             log.debug("No credentials found for external login module. 
ignoring.");
             return false;
         }
 
-        // remember userID as we need this so often
-        final String userId = credentials instanceof SimpleCredentials ? 
((SimpleCredentials) credentials).getUserID() : null;
         try {
             SyncedIdentity sId = null;
             if (userId != null) {
@@ -189,12 +196,19 @@ public class ExternalLoginModule extends
                 }
             }
 
-            externalUser = idp.authenticate(credentials);
+            if (preAuthLogin != null) {
+                externalUser = idp.getUser(preAuthLogin.getUserId());
+            } else {
+                externalUser = idp.authenticate(credentials);
+            }
+
             if (externalUser != null) {
                 log.debug("IDP {} returned valid user {}", idp.getName(), 
externalUser);
 
-                //noinspection unchecked
-                sharedState.put(SHARED_KEY_CREDENTIALS, credentials);
+                if (credentials != null) {
+                    //noinspection unchecked
+                    sharedState.put(SHARED_KEY_CREDENTIALS, credentials);
+                }
 
                 //noinspection unchecked
                 sharedState.put(SHARED_KEY_LOGIN_NAME, externalUser.getId());
@@ -244,7 +258,9 @@ public class ExternalLoginModule extends
         if (!principals.isEmpty()) {
             if (!subject.isReadOnly()) {
                 subject.getPrincipals().addAll(principals);
-                subject.getPublicCredentials().add(credentials);
+                if (credentials != null) {
+                    subject.getPublicCredentials().add(credentials);
+                }
                 setAuthInfo(createAuthInfo(externalUser.getId(), principals), 
subject);
             } else {
                 log.debug("Could not add information to read only subject {}", 
subject);

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/LoginModuleImpl.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/LoginModuleImpl.java?rev=1580079&r1=1580078&r2=1580079&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/LoginModuleImpl.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/LoginModuleImpl.java
 Fri Mar 21 22:57:40 2014
@@ -38,6 +38,7 @@ import org.apache.jackrabbit.oak.spi.sec
 import org.apache.jackrabbit.oak.spi.security.authentication.AuthInfoImpl;
 import org.apache.jackrabbit.oak.spi.security.authentication.Authentication;
 import 
org.apache.jackrabbit.oak.spi.security.authentication.ImpersonationCredentials;
+import 
org.apache.jackrabbit.oak.spi.security.authentication.PreAuthenticatedLogin;
 import org.apache.jackrabbit.oak.spi.security.user.UserConfiguration;
 import org.apache.jackrabbit.oak.spi.security.user.util.UserUtil;
 import org.slf4j.Logger;
@@ -111,23 +112,31 @@ public final class LoginModuleImpl exten
 
     @Override
     public boolean login() throws LoginException {
+        final boolean success;
         credentials = getCredentials();
-        userId = getUserId();
 
-        if (credentials == null || userId == null) {
-            log.debug("Could not extract userId/credentials");
-            return false;
+        // check if we have a pre authenticated login from a previous login 
module
+        PreAuthenticatedLogin preAuthLogin = getSharedPreAuthLogin();
+        if (preAuthLogin != null) {
+            userId = preAuthLogin.getUserId();
+            Authentication authentication = new UserAuthentication(userId, 
getUserManager());
+            success = 
authentication.authenticate(UserAuthentication.PRE_AUTHENTICATED);
+
+        } else {
+            userId = getUserId();
+            Authentication authentication = new UserAuthentication(userId, 
getUserManager());
+            success = authentication.authenticate(credentials);
         }
 
-        Authentication authentication = new UserAuthentication(userId, 
getUserManager());
-        boolean success = authentication.authenticate(credentials);
         if (success) {
             principals = getPrincipals(userId);
 
             log.debug("Adding Credentials to shared state.");
+            //noinspection unchecked
             sharedState.put(SHARED_KEY_CREDENTIALS, credentials);
 
             log.debug("Adding login name to shared state.");
+            //noinspection unchecked
             sharedState.put(SHARED_KEY_LOGIN_NAME, userId);
         }
         return success;

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/UserAuthentication.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/UserAuthentication.java?rev=1580079&r1=1580078&r2=1580079&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/UserAuthentication.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/security/authentication/user/UserAuthentication.java
 Fri Mar 21 22:57:40 2014
@@ -58,6 +58,8 @@ import org.slf4j.LoggerFactory;
  */
 class UserAuthentication implements Authentication {
 
+    static final Credentials PRE_AUTHENTICATED = new Credentials() { };
+
     private static final Logger log = 
LoggerFactory.getLogger(UserAuthentication.class);
 
     private final String userId;
@@ -71,7 +73,7 @@ class UserAuthentication implements Auth
     //-----------------------------------------------------< Authentication 
>---
     @Override
     public boolean authenticate(Credentials credentials) throws LoginException 
{
-        if (userId == null || userManager == null) {
+        if (userId == null || userManager == null || credentials == null) {
             return false;
         }
 
@@ -105,7 +107,7 @@ class UserAuthentication implements Auth
                 checkSuccess(success, "Impersonation not allowed.");
             } else {
                 // guest login is allowed if an anonymous user exists in the 
content (see get user above)
-                success = (credentials instanceof GuestCredentials);
+                success = (credentials instanceof GuestCredentials) || 
credentials == PRE_AUTHENTICATED;
             }
         } catch (RepositoryException e) {
             throw new LoginException(e.getMessage());

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/AbstractLoginModule.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/AbstractLoginModule.java?rev=1580079&r1=1580078&r2=1580079&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/AbstractLoginModule.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/AbstractLoginModule.java
 Fri Mar 21 22:57:40 2014
@@ -163,6 +163,12 @@ public abstract class AbstractLoginModul
      */
     public static final String SHARED_KEY_ATTRIBUTES = 
"javax.security.auth.login.attributes";
 
+    /**
+     * Key of the sharedState entry referring to pre authenticated login 
information that is shared
+     * between multiple login modules.
+     */
+    public static final String SHARED_KEY_PRE_AUTH_LOGIN = 
PreAuthenticatedLogin.class.getName();
+
     protected Subject subject;
     protected CallbackHandler callbackHandler;
     protected Map sharedState;
@@ -312,6 +318,20 @@ public abstract class AbstractLoginModul
     }
 
     /**
+     * @return The pre authenticated login or {@code null}
+     * @see #SHARED_KEY_PRE_AUTH_LOGIN
+     */
+    @CheckForNull
+    protected PreAuthenticatedLogin getSharedPreAuthLogin() {
+        Object login = sharedState.get(SHARED_KEY_PRE_AUTH_LOGIN);
+        if (login instanceof PreAuthenticatedLogin) {
+            return (PreAuthenticatedLogin) login;
+        } else {
+            return null;
+        }
+    }
+
+    /**
      * Tries to obtain the {@code SecurityProvider} object from the callback
      * handler using a new SecurityProviderCallback and keeps the value as
      * private field. If the callback handler isn't able to handle the

Added: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/PreAuthenticatedLogin.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/PreAuthenticatedLogin.java?rev=1580079&view=auto
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/PreAuthenticatedLogin.java
 (added)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/PreAuthenticatedLogin.java
 Fri Mar 21 22:57:40 2014
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.spi.security.authentication;
+
+/**
+ * {@code PreAuthenticatedLogin} is used as marker in the shared map of the 
login context. it indicates that the
+ * respective user is pre authenticated on an external system. Note that is 
class is only used internally by the
+ * login modules and cannot be "abused" from outside.
+ */
+final public class PreAuthenticatedLogin {
+
+    private final String userId;
+
+    public PreAuthenticatedLogin(String userId) {
+        this.userId = userId;
+    }
+
+    public String getUserId() {
+        return userId;
+    }
+}
\ No newline at end of file

Modified: 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/package-info.java
URL: 
http://svn.apache.org/viewvc/jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/package-info.java?rev=1580079&r1=1580078&r2=1580079&view=diff
==============================================================================
--- 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/package-info.java
 (original)
+++ 
jackrabbit/oak/trunk/oak-core/src/main/java/org/apache/jackrabbit/oak/spi/security/authentication/package-info.java
 Fri Mar 21 22:57:40 2014
@@ -14,8 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-@Version("0.16")
-@Export(optional = "provide:=true")
+@Version("0.17")
 package org.apache.jackrabbit.oak.spi.security.authentication;
 
 import aQute.bnd.annotation.Version;


Reply via email to