Author: jlmonteiro
Date: Wed Dec 23 15:25:31 2009
New Revision: 893545

URL: http://svn.apache.org/viewvc?rev=893545&view=rev
Log:
OPENEJB-1123: provide a way to change the default user of the 
AbstractSecurityService.

Modified:
    
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java
    
openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.embedded/service-jar.xml
    
openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml
    
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/security/SecurityTest.java

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java?rev=893545&r1=893544&r2=893545&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/security/AbstractSecurityService.java
 Wed Dec 23 15:25:31 2009
@@ -61,10 +61,10 @@
 public abstract class AbstractSecurityService implements 
SecurityService<UUID>, ThreadContextListener, 
BasicPolicyConfiguration.RoleResolver {
     static private final Map<Object, Identity> identities = new 
ConcurrentHashMap<Object, Identity>();
     static protected final ThreadLocal<Identity> clientIdentity = new 
ThreadLocal<Identity>();
-    protected final String defaultUser = "guest";
-    protected final Subject defaultSubject;
-    protected final SecurityContext defaultContext;
+    protected String defaultUser = "guest";
     private String realmName = "PropertiesLogin";
+    protected Subject defaultSubject;
+    protected SecurityContext defaultContext;
 
     public AbstractSecurityService() {
         this(BasicJaccProvider.class.getName());
@@ -77,12 +77,13 @@
 
         ThreadContext.addThreadContextListener(this);
 
-        defaultSubject = createSubject(defaultUser);
-        defaultContext = new SecurityContext(defaultSubject);
+        // set the default subject and the default context
+        updateSecurityContext();
 
         
SystemInstance.get().setComponent(BasicPolicyConfiguration.RoleResolver.class, 
this);
     }
 
+
     public String getRealmName() {
         return realmName;
     }
@@ -90,7 +91,30 @@
     public void setRealmName(String realmName) {
         this.realmName = realmName;
     }
+    
+    /**
+     * @return the defaultUser
+     */
+    public String getDefaultUser() {
+        return defaultUser;
+    }
+
+    /**
+     * @param defaultUser the defaultUser to set
+     */
+    public void setDefaultUser(String defaultUser) {
+        this.defaultUser = defaultUser;
+        
+        // set the default subject and the default context for the new default 
user
+        updateSecurityContext();
+    }
 
+    // update the current subject and security context
+    private void updateSecurityContext() {
+        defaultSubject = createSubject(defaultUser);
+        defaultContext = new SecurityContext(defaultSubject);
+    }
+    
     public void init(Properties props) throws Exception {
     }
 

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.embedded/service-jar.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.embedded/service-jar.xml?rev=893545&r1=893544&r2=893545&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.embedded/service-jar.xml
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb.embedded/service-jar.xml
 Wed Dec 23 15:25:31 2009
@@ -247,7 +247,10 @@
           id="Default Security Service"
           service="SecurityService"
           types="SecurityService"
-          class-name="org.apache.openejb.core.security.SecurityServiceImpl"/>
+          class-name="org.apache.openejb.core.security.SecurityServiceImpl">
+  
+    DefaultUser "guest"         
+  </ServiceProvider>
 
   <ServiceProvider
           id="PseudoSecurityService"

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml?rev=893545&r1=893544&r2=893545&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/main/resources/META-INF/org.apache.openejb/service-jar.xml
 Wed Dec 23 15:25:31 2009
@@ -250,7 +250,10 @@
           id="Default Security Service"
           service="SecurityService"
           types="SecurityService"
-          class-name="org.apache.openejb.core.security.SecurityServiceImpl"/>
+          class-name="org.apache.openejb.core.security.SecurityServiceImpl">
+  
+    DefaultUser "guest"         
+  </ServiceProvider>
 
   <ServiceProvider
           id="PseudoSecurityService"

Modified: 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/security/SecurityTest.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/security/SecurityTest.java?rev=893545&r1=893544&r2=893545&view=diff
==============================================================================
--- 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/security/SecurityTest.java
 (original)
+++ 
openejb/trunk/openejb3/container/openejb-core/src/test/java/org/apache/openejb/core/security/SecurityTest.java
 Wed Dec 23 15:25:31 2009
@@ -17,7 +17,8 @@
 package org.apache.openejb.core.security;
 
 import junit.framework.TestCase;
-import org.apache.openejb.core.ivm.naming.InitContextFactory;
+
+import org.apache.openejb.client.LocalInitialContextFactory;
 import org.apache.openejb.config.ConfigurationFactory;
 import org.apache.openejb.assembler.classic.Assembler;
 import org.apache.openejb.assembler.classic.ProxyFactoryInfo;
@@ -45,13 +46,10 @@
  */
 public class SecurityTest extends TestCase {
 
+    private Assembler configureAssembler(String defaultUser) throws Exception {
+        System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, 
LocalInitialContextFactory.class.getName());
 
-    public void _test() throws Exception {
-    }
-
-    public void test() throws Exception {
-        System.setProperty(javax.naming.Context.INITIAL_CONTEXT_FACTORY, 
InitContextFactory.class.getName());
-
+        
         ConfigurationFactory config = new ConfigurationFactory();
         Assembler assembler = new Assembler();
 
@@ -63,6 +61,11 @@
         serviceInfo.className = SecurityServiceImpl.class.getName();
         serviceInfo.id = "New Security Service";
         serviceInfo.properties = new Properties();
+        if (defaultUser != null) {
+            // override the default user
+            serviceInfo.properties.setProperty("DefaultUser", defaultUser);
+            
+        }
 
         assembler.createSecurityService(serviceInfo);
 
@@ -78,17 +81,21 @@
 
         assembler.createApplication(ejbJarInfo);
 
+        return assembler;
+    }
+
+    public void test() throws Exception {
+        Assembler assembler = configureAssembler(null);
+
         Properties props = new Properties();
         props.setProperty(Context.SECURITY_PRINCIPAL, "jonathan");
         props.setProperty(Context.SECURITY_CREDENTIALS, "secret");
 
         InitialContext ctx = new InitialContext(props);
 
-
         Project foo = (Project) ctx.lookup("FooBeanLocal");
 
         foo.svnCheckout("");
-
         foo.svnCommit("");
 
         try {
@@ -101,7 +108,10 @@
         assertTrue("not in role committer", foo.isCallerInRole("committer"));
         assertTrue("not in role community", foo.isCallerInRole("community"));
         assertFalse("in role contributor", foo.isCallerInRole("contributor"));
-
+        
+        ctx.close();
+        assembler.destroy();
+        
 //        Project bar = (Project) ctx.lookup("BarBeanLocal");
 //
 //        bar.svnCheckout("");
@@ -123,11 +133,67 @@
 //        assertFalse("in role committer", bar.isCallerInRole("committer"));
 //        assertFalse("in role community", bar.isCallerInRole("community"));
 //        assertTrue("not in role contributor", 
bar.isCallerInRole("contributor"));
+    }
+    
+    // When no credentials are provided, the default user/role should be 
"guest"
+    public void testUnauthenticatedUser() throws Exception {
+        Assembler assembler = configureAssembler(null);
+
+        // no credentials provided, the default user should be "guest"
+        Properties props = new Properties();
+
+        InitialContext ctx = new InitialContext(props);
 
+        Project foo = (Project) ctx.lookup("FooBeanLocal");
+
+        foo.svnCheckout("");
+        try {
+            foo.svnCommit("");
+            fail("Should not be allowed");
+        } catch (Exception e) {
+            // good.
+        }
+
+        assertFalse("in role committer", foo.isCallerInRole("committer"));
+        assertFalse("in role community", foo.isCallerInRole("community"));
+        assertFalse("in role contributor", foo.isCallerInRole("contributor"));
+        assertTrue("not in role guest", foo.isCallerInRole("guest"));
+        
+        ctx.close();
+        assembler.destroy();
+    }
+    
+    // Just to be sure we can override the default user (ie. guest)
+    public void testDefaultUser() throws Exception {
+        Assembler assembler = configureAssembler("public");
+
+        // no credentials provided, the default user should be "guest"
+        Properties props = new Properties();
+
+        InitialContext ctx = new InitialContext(props);
+
+        Project foo = (Project) ctx.lookup("FooBeanLocal");
+
+        foo.svnCheckout("");
+        try {
+            foo.svnCommit("");
+            fail("Should not be allowed");
+        } catch (Exception e) {
+            // good.
+        }
+
+        assertFalse("in role committer", foo.isCallerInRole("committer"));
+        assertFalse("in role community", foo.isCallerInRole("community"));
+        assertFalse("in role contributor", foo.isCallerInRole("contributor"));
+        assertFalse("in role guest", foo.isCallerInRole("guest"));
+        assertTrue("not in role public", foo.isCallerInRole("public"));
+        
+        ctx.close();
+        assembler.destroy();
     }
 
     @Stateless
-    @DeclareRoles({"committer", "contributor","community"})
+    @DeclareRoles({"committer", "contributor","community","guest","public"})
     public static class FooBean implements Project {
 
         @Resource


Reply via email to