Author: ammulder Date: Mon Nov 22 18:03:22 2004 New Revision: 106257 Added: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/DeploymentSupport.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/FileAuditLoginModule.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/GeronimoGroupPrincipal.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/GeronimoUserPrincipal.java geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/DeploymentSupportTest.java Removed: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/PropertiesFileGroupPrincipal.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/PropertiesFileUserPrincipal.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/SQLGroupPrincipal.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/SQLUserPrincipal.java Modified: geronimo/trunk/modules/assembly/src/plan/j2ee-secure-plan.xml geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/security/PasswordCredentialRealm.java geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyWebAppJACCContext.java geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyXMLConfiguration.java geronimo/trunk/modules/jetty/src/test-resources/deployables/war3/WEB-INF/geronimo-web.xml geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/BaseSecurityTest.java geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/PrimaryRealmPrincipal.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/RealmPrincipal.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/deploy/Security.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/DirectConfigurationEntry.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/GeronimoLoginConfiguration.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginModuleConfiguration.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginService.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginServiceMBean.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasSecurityContext.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/LoginModuleGBean.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/ServerRealmConfigurationEntry.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/AutoMapAssistant.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/SecurityRealm.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/PropertiesFileLoginModule.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/SQLLoginModule.java geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/util/ConfigurationUtil.java geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/AbstractTest.java geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/ConfigurationEntryTest.java geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginPropertiesFileTest.java geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginSQLTest.java geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/TimeoutTest.java geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/network/protocol/SubjectCarryingProtocolTest.java Log: Next round of security improvements - add login domains - consolidate principal classes - pull deployment methods out of realm into helper interface - add auditing login module - test & fix realms with multiple login modules - add flag to control whether server-side principals are returned to client - update all tests and plans with the new syntax
Modified: geronimo/trunk/modules/assembly/src/plan/j2ee-secure-plan.xml Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/assembly/src/plan/j2ee-secure-plan.xml?view=diff&rev=106257&p1=geronimo/trunk/modules/assembly/src/plan/j2ee-secure-plan.xml&r1=106256&p2=geronimo/trunk/modules/assembly/src/plan/j2ee-secure-plan.xml&r2=106257 ============================================================================== --- geronimo/trunk/modules/assembly/src/plan/j2ee-secure-plan.xml (original) +++ geronimo/trunk/modules/assembly/src/plan/j2ee-secure-plan.xml Mon Nov 22 18:03:22 2004 @@ -44,6 +44,7 @@ usersURI=var/security/demo_users.properties groupsURI=var/security/demo_groups.properties </attribute> + <attribute name="loginDomainName" type="java.lang.String">demo-properties-realm</attribute> </gbean> <gbean name="geronimo.security:type=SecurityRealm,realm=demo-properties-realm" Modified: geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml?view=diff&rev=106257&p1=geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml&r1=106256&p2=geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml&r2=106257 ============================================================================== --- geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml (original) +++ geronimo/trunk/modules/assembly/src/plan/j2ee-server-plan.xml Mon Nov 22 18:03:22 2004 @@ -108,6 +108,7 @@ usersURI=var/security/users.properties groupsURI=var/security/groups.properties </attribute> + <attribute name="loginDomainName" type="java.lang.String">geronimo-properties-realm</attribute> </gbean> <gbean name="geronimo.security:type=SecurityRealm,realm=geronimo-properties-realm" Modified: geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/security/PasswordCredentialRealm.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/security/PasswordCredentialRealm.java?view=diff&rev=106257&p1=geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/security/PasswordCredentialRealm.java&r1=106256&p2=geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/security/PasswordCredentialRealm.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/security/PasswordCredentialRealm.java (original) +++ geronimo/trunk/modules/connector/src/java/org/apache/geronimo/connector/outbound/security/PasswordCredentialRealm.java Mon Nov 22 18:03:22 2004 @@ -20,10 +20,6 @@ import javax.resource.spi.ManagedConnectionFactory; import java.util.HashMap; import java.util.Map; -import java.util.Set; - -import org.apache.regexp.RE; - import org.apache.geronimo.common.GeronimoSecurityException; import org.apache.geronimo.gbean.GBeanInfo; import org.apache.geronimo.gbean.GBeanInfoBuilder; @@ -33,6 +29,7 @@ import org.apache.geronimo.security.jaas.JaasLoginModuleConfiguration; import org.apache.geronimo.security.jaas.LoginModuleControlFlag; import org.apache.geronimo.security.realm.SecurityRealm; +import org.apache.geronimo.security.realm.DeploymentSupport; /** * @@ -59,40 +56,29 @@ return realmName; } - public Set getGroupPrincipals() throws GeronimoSecurityException { - return null; + public boolean isRestrictPrincipalsToServer() { + return true; } - public Set getGroupPrincipals(RE regexExpression) throws GeronimoSecurityException { - return null; + public String[] getLoginDomains() { + return new String[]{realmName}; } - public Set getUserPrincipals() throws GeronimoSecurityException { + public DeploymentSupport getDeploymentSupport(String loginDomain) throws GeronimoSecurityException { return null; } - public Set getUserPrincipals(RE regexExpression) throws GeronimoSecurityException { - return null; - } - - public void refresh() throws GeronimoSecurityException { - } - public JaasLoginModuleConfiguration[] getAppConfigurationEntries() { Map options = new HashMap(); // TODO: This can be a bad thing, passing a reference to a realm to the login module // since the SerializableACE can be sent remotely options.put(REALM_INSTANCE, this); - JaasLoginModuleConfiguration config = new JaasLoginModuleConfiguration(getRealmName(), PasswordCredentialLoginModule.class.getName(), - LoginModuleControlFlag.REQUISITE, options, true); + JaasLoginModuleConfiguration config = new JaasLoginModuleConfiguration(PasswordCredentialLoginModule.class.getName(), + LoginModuleControlFlag.REQUISITE, options, true, getRealmName()); return new JaasLoginModuleConfiguration[]{config}; } - public boolean isLoginModuleLocal() { - return true; - } - public void setManagedConnectionFactory(ManagedConnectionFactory managedConnectionFactory) { this.managedConnectionFactory = managedConnectionFactory; } @@ -110,7 +96,7 @@ options.put("realm", realmName); options.put("kernel", kernel.getKernelName()); - return new JaasLoginModuleConfiguration(realmName, JaasLoginCoordinator.class.getName(), LoginModuleControlFlag.REQUIRED, options, true); + return new JaasLoginModuleConfiguration(JaasLoginCoordinator.class.getName(), LoginModuleControlFlag.REQUIRED, options, true, realmName); } static { Modified: geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyWebAppJACCContext.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyWebAppJACCContext.java?view=diff&rev=106257&p1=geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyWebAppJACCContext.java&r1=106256&p2=geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyWebAppJACCContext.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyWebAppJACCContext.java (original) +++ geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyWebAppJACCContext.java Mon Nov 22 18:03:22 2004 @@ -412,11 +412,13 @@ JAASJettyPrincipal result = new JAASJettyPrincipal("default"); Subject defaultSubject = new Subject(); - RealmPrincipal realmPrincipal = ConfigurationUtil.generateRealmPrincipal(defaultPrincipal.getPrincipal(), defaultPrincipal.getRealmName()); + //todo: needs a proper login domain name to go with the realm name + RealmPrincipal realmPrincipal = ConfigurationUtil.generateRealmPrincipal(defaultPrincipal.getPrincipal(), defaultPrincipal.getRealmName(), defaultPrincipal.getRealmName()); if (realmPrincipal == null) { throw new GeronimoSecurityException("Unable to create realm principal"); } - PrimaryRealmPrincipal primaryRealmPrincipal = ConfigurationUtil.generatePrimaryRealmPrincipal(defaultPrincipal.getPrincipal(), defaultPrincipal.getRealmName()); + //todo: needs a proper login domain name to go with the realm name + PrimaryRealmPrincipal primaryRealmPrincipal = ConfigurationUtil.generatePrimaryRealmPrincipal(defaultPrincipal.getPrincipal(), defaultPrincipal.getRealmName(), defaultPrincipal.getRealmName()); if (primaryRealmPrincipal == null) { throw new GeronimoSecurityException("Unable to create primary realm principal"); } Modified: geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyXMLConfiguration.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyXMLConfiguration.java?view=diff&rev=106257&p1=geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyXMLConfiguration.java&r1=106256&p2=geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyXMLConfiguration.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyXMLConfiguration.java (original) +++ geronimo/trunk/modules/jetty/src/java/org/apache/geronimo/jetty/JettyXMLConfiguration.java Mon Nov 22 18:03:22 2004 @@ -341,8 +341,8 @@ Iterator principals = realm.getPrincipals().iterator(); while (principals.hasNext()) { Principal principal = (Principal) principals.next(); - - RealmPrincipal realmPrincipal = ConfigurationUtil.generateRealmPrincipal(principal, realm.getRealmName()); + //todo: The next line must use a login domain name, which I guess means that neds to go in the geronimo-jetty.xml + RealmPrincipal realmPrincipal = ConfigurationUtil.generateRealmPrincipal(principal, realm.getRealmName(), realm.getRealmName()); if (realmPrincipal == null) throw new GeronimoSecurityException("Unable to create realm principal"); principalSet.add(realmPrincipal); Modified: geronimo/trunk/modules/jetty/src/test-resources/deployables/war3/WEB-INF/geronimo-web.xml Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/test-resources/deployables/war3/WEB-INF/geronimo-web.xml?view=diff&rev=106257&p1=geronimo/trunk/modules/jetty/src/test-resources/deployables/war3/WEB-INF/geronimo-web.xml&r1=106256&p2=geronimo/trunk/modules/jetty/src/test-resources/deployables/war3/WEB-INF/geronimo-web.xml&r2=106257 ============================================================================== --- geronimo/trunk/modules/jetty/src/test-resources/deployables/war3/WEB-INF/geronimo-web.xml (original) +++ geronimo/trunk/modules/jetty/src/test-resources/deployables/war3/WEB-INF/geronimo-web.xml Mon Nov 22 18:03:22 2004 @@ -25,7 +25,7 @@ <context-priority-classloader>false</context-priority-classloader> <sec:security> <sec:default-principal realm-name="demo-properties-realm"> - <sec:principal class="org.apache.geronimo.security.realm.providers.PropertiesFileUserPrincipal" name="metro"/> + <sec:principal class="org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal" name="metro"/> </sec:default-principal> </sec:security> </web-app> Modified: geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/BaseSecurityTest.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/BaseSecurityTest.java?view=diff&rev=106257&p1=geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/BaseSecurityTest.java&r1=106256&p2=geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/BaseSecurityTest.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/BaseSecurityTest.java (original) +++ geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/BaseSecurityTest.java Mon Nov 22 18:03:22 2004 @@ -128,6 +128,7 @@ options.setProperty("usersURI", "src/test-resources/data/users.properties"); options.setProperty("groupsURI", "src/test-resources/data/groups.properties"); propertiesLMGBean.setAttribute("options", options); + propertiesLMGBean.setAttribute("loginDomainName", "demo-properties-realm"); propertiesRealmGBean = new GBeanMBean("org.apache.geronimo.security.realm.GenericSecurityRealm"); propertiesRealmName = new ObjectName("geronimo.security:type=SecurityRealm,realm=demo-properties-realm"); @@ -136,8 +137,8 @@ Properties config = new Properties(); config.setProperty("LoginModule.1.REQUIRED", propertiesLMName.getCanonicalName()); propertiesRealmGBean.setAttribute("loginModuleConfiguration", config); - propertiesRealmGBean.setAttribute("autoMapPrincipalClasses", "org.apache.geronimo.security.realm.providers.PropertiesFileGroupPrincipal"); - propertiesRealmGBean.setAttribute("defaultPrincipal", "metro=org.apache.geronimo.security.realm.providers.PropertiesFileUserPrincipal"); +// propertiesRealmGBean.setAttribute("autoMapPrincipalClasses", "demo-properties-realm=org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal"); + propertiesRealmGBean.setAttribute("defaultPrincipal", "metro=org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"); start(serverInfoName, serverInfoGBean); start(propertiesLMName, propertiesLMGBean); Modified: geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java?view=diff&rev=106257&p1=geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java&r1=106256&p2=geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java (original) +++ geronimo/trunk/modules/jetty/src/test/org/apache/geronimo/jetty/SecurityTest.java Mon Nov 22 18:03:22 2004 @@ -55,7 +55,7 @@ DefaultPrincipal defaultPrincipal = new DefaultPrincipal(); defaultPrincipal.setRealmName("demo-properties-realm"); Principal principal = new Principal(); - principal.setClassName("org.apache.geronimo.security.realm.providers.PropertiesFileUserPrincipal"); + principal.setClassName("org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"); principal.setPrincipalName("izumi"); defaultPrincipal.setPrincipal(principal); @@ -64,7 +64,7 @@ Role role = new Role(); role.setRoleName("content-administrator"); principal = new Principal(); - principal.setClassName("org.apache.geronimo.security.realm.providers.PropertiesFileGroupPrincipal"); + principal.setClassName("org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal"); principal.setPrincipalName("it"); Realm realm = new Realm(); realm.setRealmName("demo-properties-realm"); @@ -247,7 +247,7 @@ DefaultPrincipal defaultPrincipal = new DefaultPrincipal(); defaultPrincipal.setRealmName("demo-properties-realm"); Principal principal = new Principal(); - principal.setClassName("org.apache.geronimo.security.realm.providers.PropertiesFileUserPrincipal"); + principal.setClassName("org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal"); principal.setPrincipalName("izumi"); defaultPrincipal.setPrincipal(principal); @@ -256,7 +256,7 @@ Role role = new Role(); role.setRoleName("content-administrator"); principal = new Principal(); - principal.setClassName("org.apache.geronimo.security.realm.providers.PropertiesFileGroupPrincipal"); + principal.setClassName("org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal"); principal.setPrincipalName("it"); Realm realm = new Realm(); realm.setRealmName("demo-properties-realm"); Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/PrimaryRealmPrincipal.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/PrimaryRealmPrincipal.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/PrimaryRealmPrincipal.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/PrimaryRealmPrincipal.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/PrimaryRealmPrincipal.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/PrimaryRealmPrincipal.java Mon Nov 22 18:03:22 2004 @@ -25,8 +25,8 @@ */ public class PrimaryRealmPrincipal extends RealmPrincipal { - public PrimaryRealmPrincipal(String realm, Principal principal) { - super(realm, principal); + public PrimaryRealmPrincipal(String loginDomain, Principal principal, String realmName) { + super(loginDomain, principal, realmName); } /** @@ -43,6 +43,6 @@ PrimaryRealmPrincipal realmPrincipal = (PrimaryRealmPrincipal) another; - return getRealm().equals(realmPrincipal.getRealm()) && getPrincipal().equals(realmPrincipal.getPrincipal()); + return getLoginDomain().equals(realmPrincipal.getLoginDomain()) && getPrincipal().equals(realmPrincipal.getPrincipal()); } } Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/RealmPrincipal.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/RealmPrincipal.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/RealmPrincipal.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/RealmPrincipal.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/RealmPrincipal.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/RealmPrincipal.java Mon Nov 22 18:03:22 2004 @@ -19,6 +19,7 @@ import java.io.Serializable; import java.security.Principal; +import org.apache.geronimo.common.NullArgumentException; /** @@ -27,17 +28,18 @@ * @version $Rev$ $Date$ */ public class RealmPrincipal implements Principal, Serializable { - private final String realm; + private final String loginDomain; private final Principal principal; private transient String name = null; private transient long id; - public RealmPrincipal(String realm, Principal principal) { - if (realm == null) throw new IllegalArgumentException("realm == null"); - if (principal == null) throw new IllegalArgumentException("principal == null"); + public RealmPrincipal(String loginDomain, Principal principal, String realmName) { + if (loginDomain == null) throw new NullArgumentException("loginDomain"); + if (principal == null) throw new NullArgumentException("principal"); - this.realm = realm; + this.loginDomain = loginDomain; this.principal = principal; + //todo: ignoring realm name; we don't think we'll need it. } public long getId() { @@ -62,7 +64,7 @@ RealmPrincipal realmPrincipal = (RealmPrincipal) another; - return realm.equals(realmPrincipal.realm) && principal.equals(realmPrincipal.principal); + return loginDomain.equals(realmPrincipal.loginDomain) && principal.equals(realmPrincipal.principal); } /** @@ -92,7 +94,7 @@ if (name == null) { StringBuffer buffer = new StringBuffer(""); - buffer.append(realm); + buffer.append(loginDomain); buffer.append(":["); buffer.append(principal.getClass().getName()); buffer.append(':'); @@ -118,7 +120,7 @@ * * @return the realm that is associated with the principal. */ - public String getRealm() { - return realm; + public String getLoginDomain() { + return loginDomain; } } Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/deploy/Security.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/deploy/Security.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/deploy/Security.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/deploy/Security.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/deploy/Security.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/deploy/Security.java Mon Nov 22 18:03:22 2004 @@ -129,12 +129,13 @@ realm.setRealmName(assistant.getSecurityRealm()); - for (Iterator principalClasses = autoMapAssistant.obtainRolePrincipalClasses().iterator(); principalClasses.hasNext();) { + //todo: the usage of the realm name in the next call instead of the login domain name is an error! + for (Iterator principalClasses = autoMapAssistant.obtainRolePrincipalClasses(realmName).iterator(); principalClasses.hasNext();) { Principal principal = new Principal(); - + //todo: Principal class needs to handle login domain as well principal.setClassName((String) principalClasses.next()); principal.setPrincipalName(roleName); - principal.setDesignatedRunAs(true); + principal.setDesignatedRunAs(false); realm.getPrincipals().add(principal); } Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/DirectConfigurationEntry.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/DirectConfigurationEntry.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/DirectConfigurationEntry.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/DirectConfigurationEntry.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/DirectConfigurationEntry.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/DirectConfigurationEntry.java Mon Nov 22 18:03:22 2004 @@ -50,7 +50,7 @@ } public JaasLoginModuleConfiguration generateConfiguration() { - return new JaasLoginModuleConfiguration(applicationConfigName, module.getLoginModuleClass(), controlFlag, module.getOptions(), module.isServerSide()); + return new JaasLoginModuleConfiguration(module.getLoginModuleClass(), controlFlag, module.getOptions(), module.isServerSide(), applicationConfigName); } public static final GBeanInfo GBEAN_INFO; Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/GeronimoLoginConfiguration.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/GeronimoLoginConfiguration.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/GeronimoLoginConfiguration.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/GeronimoLoginConfiguration.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/GeronimoLoginConfiguration.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/GeronimoLoginConfiguration.java Mon Nov 22 18:03:22 2004 @@ -92,7 +92,6 @@ if (sm != null) sm.checkPermission(SecurityService.CONFIGURE); ConfigurationEntryFactory factory = (ConfigurationEntryFactory) event.getMember(); - addConfiguration(factory); } @@ -108,6 +107,12 @@ private final void addConfiguration(ConfigurationEntryFactory factory) { JaasLoginModuleConfiguration config = factory.generateConfiguration(); + if(config.getLoginDomainName() == null) { + throw new IllegalArgumentException("A login module to be registered standalone must have a domain name!"); + } + if (entries.containsKey(factory.getConfigurationName())) { + throw new java.lang.IllegalArgumentException("ConfigurationEntry already registered"); + } AppConfigurationEntry ace = new AppConfigurationEntry(config.getLoginModuleClassName(), config.getFlag().getFlag(), config.getOptions()); entries.put(factory.getConfigurationName(), ace); Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginCoordinator.java Mon Nov 22 18:03:22 2004 @@ -99,7 +99,11 @@ for (int i = 0; i < workers.length; i++) { workers[i].getModule().commit(); } - subject.getPrincipals().add(service.loginSucceeded(client)); + Principal[] principals = service.loginSucceeded(client); + for (int i = 0; i < principals.length; i++) { + Principal principal = principals[i]; + subject.getPrincipals().add(principal); + } return true; } @@ -111,6 +115,7 @@ } finally { service.loginFailed(client); } + clear(); return true; } @@ -122,9 +127,24 @@ } finally { service.logout(client); } + clear(); return true; } + private void clear() { + serverHost = null; + serverPort = 0; + realmName = null; + kernelName = null; + service = null; + handler = null; + subject = null; + processedPrincipals.clear(); + config = null; + client = null; + workers = null; + } + private JaasLoginServiceMBean connect() { if(serverHost != null && serverPort > 0) { return JaasLoginServiceRemotingClient.create(serverHost, serverPort); @@ -186,15 +206,11 @@ public void initialize(Subject subject, CallbackHandler handler, Map sharedState, Map options) { this.handler = handler; - try { - callbacks = service.getServerLoginCallbacks(client, index); - } catch (LoginException e) { - throw new RuntimeException("Server unable to initialize login module", e); - } } public boolean login() throws LoginException { try { + callbacks = service.getServerLoginCallbacks(client, index); if(handler != null) { handler.handle(callbacks); } else if(callbacks != null && callbacks.length > 0) { Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginModuleConfiguration.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginModuleConfiguration.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginModuleConfiguration.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginModuleConfiguration.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginModuleConfiguration.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginModuleConfiguration.java Mon Nov 22 18:03:22 2004 @@ -35,18 +35,21 @@ */ public class JaasLoginModuleConfiguration implements Serializable { private boolean serverSide; - private String name; + private String loginDomainName; private LoginModuleControlFlag flag; private String loginModuleName; private Map options; private transient LoginModule loginModule; - public JaasLoginModuleConfiguration(String name, String loginModuleName, LoginModuleControlFlag flag, Map options, boolean serverSide) { - this.name = name; + public JaasLoginModuleConfiguration(String loginModuleName, LoginModuleControlFlag flag, Map options, boolean serverSide, String loginDomainName) { this.serverSide = serverSide; this.flag = flag; this.loginModuleName = loginModuleName; this.options = options; + this.loginDomainName = loginDomainName; + } + public JaasLoginModuleConfiguration(String loginModuleName, LoginModuleControlFlag flag, Map options, boolean serverSide) { + this(loginModuleName, flag, options, serverSide, null); } public String getLoginModuleClassName() { @@ -76,8 +79,8 @@ return options; } - public String getName() { - return name; + public String getLoginDomainName() { + return loginDomainName; } /** @@ -94,6 +97,6 @@ } } - return new JaasLoginModuleConfiguration(name, loginModuleName, flag, other, serverSide); + return new JaasLoginModuleConfiguration(loginModuleName, flag, other, serverSide, loginDomainName); } } Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginService.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginService.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginService.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginService.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginService.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginService.java Mon Nov 22 18:03:22 2004 @@ -26,6 +26,7 @@ import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.ArrayList; import javax.crypto.Mac; import javax.crypto.SecretKey; import javax.crypto.spec.SecretKeySpec; @@ -153,13 +154,13 @@ * methods in this class. */ public JaasClientId connectToRealm(String realmName) { - for (Iterator it = realms.iterator(); it.hasNext();) { - SecurityRealm realm = (SecurityRealm) it.next(); - if(realm.getRealmName().equals(realmName)) { - return initializeClient(realm); - } + SecurityRealm realm = null; + realm = getRealm(realmName); + if(realm == null) { + throw new GeronimoSecurityException("No such realm ("+realmName+")"); + } else { + return initializeClient(realm); } - throw new GeronimoSecurityException("No such realm ("+realmName+")"); } /** @@ -198,6 +199,7 @@ JaasLoginModuleConfiguration config = context.getModules()[loginModuleIndex]; LoginModule module = config.getLoginModule(classLoader); //todo: properly handle shared state + context.getHandler().setExploring(); try { module.initialize(context.getSubject(), context.getHandler(), new HashMap(), config.getOptions()); } catch (Exception e) { @@ -251,7 +253,7 @@ if(loginModuleIndex < 0 || loginModuleIndex >= context.getModules().length || context.getModules()[loginModuleIndex].isServerSide()) { throw new LoginException("Invalid login module specified"); } - context.processPrincipals(clientLoginModulePrincipals); + context.processPrincipals(clientLoginModulePrincipals, context.getModules()[loginModuleIndex].getLoginDomainName()); } /** @@ -270,7 +272,7 @@ } JaasLoginModuleConfiguration module = context.getModules()[loginModuleIndex]; boolean result = module.getLoginModule(classLoader).commit(); - context.processPrincipals(); + context.processPrincipals(context.getModules()[loginModuleIndex].getLoginDomainName()); return result; } @@ -278,7 +280,7 @@ * Indicates that the overall login succeeded. All login modules that were * touched should have been logged in and committed before calling this. */ - public IdentificationPrincipal loginSucceeded(JaasClientId userIdentifier) throws LoginException { + public Principal[] loginSucceeded(JaasClientId userIdentifier) throws LoginException { JaasSecurityContext context = (JaasSecurityContext) activeLogins.get(userIdentifier); if(context == null) { throw new ExpiredLoginModuleException(); @@ -289,7 +291,15 @@ SubjectId id = ContextManager.getSubjectId(subject); IdentificationPrincipal principal = new IdentificationPrincipal(id); subject.getPrincipals().add(principal); - return principal; + SecurityRealm realm = getRealm(context.getRealmName()); + if(realm.isRestrictPrincipalsToServer()) { + return new Principal[]{principal}; + } else { + List list = new ArrayList(); + list.addAll(context.getProcessedPrincipals()); + list.add(principal); + return (Principal[]) list.toArray(new Principal[list.size()]); + } } /** @@ -311,6 +321,11 @@ } ContextManager.unregisterSubject(context.getSubject()); activeLogins.remove(userIdentifier); + for (int i = 0; i < context.getModules().length; i++) { + if(context.getModules()[i].isServerSide()) { + context.getModules()[i].getLoginModule(classLoader).logout(); + } + } } /** @@ -330,6 +345,16 @@ JaasSecurityContext context = new JaasSecurityContext(realm.getRealmName(), modules); activeLogins.put(clientId, context); return clientId; + } + + private SecurityRealm getRealm(String realmName) { + for (Iterator it = realms.iterator(); it.hasNext();) { + SecurityRealm test = (SecurityRealm) it.next(); + if(test.getRealmName().equals(realmName)) { + return test; + } + } + return null; } /** Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginServiceMBean.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginServiceMBean.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginServiceMBean.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginServiceMBean.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginServiceMBean.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasLoginServiceMBean.java Mon Nov 22 18:03:22 2004 @@ -116,7 +116,7 @@ * Indicates that the overall login succeeded. All login modules that were * touched should have been logged in and committed before calling this. */ - public IdentificationPrincipal loginSucceeded(JaasClientId userIdentifier) throws LoginException; + public Principal[] loginSucceeded(JaasClientId userIdentifier) throws LoginException; /** * Indicates that the overall login failed, and the server should release Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasSecurityContext.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasSecurityContext.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasSecurityContext.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasSecurityContext.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasSecurityContext.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/JaasSecurityContext.java Mon Nov 22 18:03:22 2004 @@ -73,25 +73,34 @@ return handler; } - public void processPrincipals() { + public void processPrincipals(String loginDomainName) { List list = new LinkedList(); for (Iterator it = subject.getPrincipals().iterator(); it.hasNext();) { Principal p = (Principal) it.next(); - if(!processedPrincipals.contains(p)) { - list.add(ContextManager.registerPrincipal(new RealmPrincipal(realmName, p))); + if(!(p instanceof RealmPrincipal) && !processedPrincipals.contains(p)) { + list.add(ContextManager.registerPrincipal(new RealmPrincipal(loginDomainName, p, realmName))); processedPrincipals.add(p); } } subject.getPrincipals().addAll(list); } - public void processPrincipals(Principal[] principals) { + public void processPrincipals(Principal[] principals, String loginDomainName) { List list = new LinkedList(); for (int i = 0; i < principals.length; i++) { Principal p = principals[i]; list.add(p); - list.add(ContextManager.registerPrincipal(new RealmPrincipal(realmName, p))); + list.add(ContextManager.registerPrincipal(new RealmPrincipal(loginDomainName, p, realmName))); + processedPrincipals.add(p); } subject.getPrincipals().addAll(list); + } + + public Set getProcessedPrincipals() { + return processedPrincipals; + } + + public String getRealmName() { + return realmName; } } Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/LoginModuleGBean.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/LoginModuleGBean.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/LoginModuleGBean.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/LoginModuleGBean.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/LoginModuleGBean.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/LoginModuleGBean.java Mon Nov 22 18:03:22 2004 @@ -30,6 +30,7 @@ * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, 14 Sep 2004) $ */ public class LoginModuleGBean { + private String loginDomainName; private String loginModuleClass; private Properties options; private String objectName; @@ -44,6 +45,14 @@ this.serverSide = serverSide; } + public String getLoginDomainName() { + return loginDomainName; + } + + public void setLoginDomainName(String loginDomainName) { + this.loginDomainName = loginDomainName; + } + public Properties getOptions() { return options; } @@ -72,6 +81,7 @@ infoFactory.addAttribute("loginModuleClass", String.class, true); infoFactory.addAttribute("objectName", String.class, false); infoFactory.addAttribute("serverSide", boolean.class, true); + infoFactory.addAttribute("loginDomainName", String.class, true); infoFactory.setConstructor(new String[]{"loginModuleClass","objectName","serverSide"}); GBEAN_INFO = infoFactory.getBeanInfo(); } Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/ServerRealmConfigurationEntry.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/ServerRealmConfigurationEntry.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/ServerRealmConfigurationEntry.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/ServerRealmConfigurationEntry.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/ServerRealmConfigurationEntry.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/jaas/ServerRealmConfigurationEntry.java Mon Nov 22 18:03:22 2004 @@ -62,7 +62,7 @@ options.put("realm", realmName); options.put("kernel", kernel.getKernelName()); - return new JaasLoginModuleConfiguration(applicationConfigName, JaasLoginCoordinator.class.getName(), LoginModuleControlFlag.REQUIRED, options, true); + return new JaasLoginModuleConfiguration(JaasLoginCoordinator.class.getName(), LoginModuleControlFlag.REQUIRED, options, true, applicationConfigName); } public static final GBeanInfo GBEAN_INFO; Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/AutoMapAssistant.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/AutoMapAssistant.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/AutoMapAssistant.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/AutoMapAssistant.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/AutoMapAssistant.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/AutoMapAssistant.java Mon Nov 22 18:03:22 2004 @@ -52,5 +52,5 @@ * * @return a set of principal class names */ - public Set obtainRolePrincipalClasses(); + public Set obtainRolePrincipalClasses(String loginDomain); } Added: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/DeploymentSupport.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/DeploymentSupport.java?view=auto&rev=106257 ============================================================================== --- (empty file) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/DeploymentSupport.java Mon Nov 22 18:03:22 2004 @@ -0,0 +1,47 @@ +/** + * + * Copyright 2003-2004 The Apache Software Foundation + * + * Licensed 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.geronimo.security.realm; + +/** + * A helper class that lists principals available in a security realm in order + * to help populate deployment descriptors. This may or may not be provided + * for a specific security realm. A LoginModule may implement this interface, + * in which case the GenericSecurityRealm can take advantage of that [and the + * LoginModule should accept an initialize(null, null, null, options) call]. + * + * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, 14 Sep 2004) $ + */ +public interface DeploymentSupport { + /** + * Gets the names of all principal classes that may be populated into + * a Subject. + */ + String[] getPrincipalClassNames(); + + /** + * Gets the names of all principal classes that should correspond to + * roles when automapping. This is a default, and may be overridden + * by specific values configured for the realm. + */ + String[] getAutoMapPrincipalClassNames(); + + /** + * Gets a list of all the principals of a particular type (identified by + * the principal class). These are available for manual role mapping. + */ + String[] getPrincipalsOfClass(String className); +} Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/GenericSecurityRealm.java Mon Nov 22 18:03:22 2004 @@ -26,9 +26,11 @@ import java.util.Map; import java.util.Properties; import java.util.Set; - -import org.apache.regexp.RE; - +import java.util.Collections; +import java.util.Iterator; +import javax.management.MalformedObjectNameException; +import javax.management.ObjectName; +import javax.security.auth.spi.LoginModule; import org.apache.geronimo.common.GeronimoSecurityException; import org.apache.geronimo.gbean.GBeanInfo; import org.apache.geronimo.gbean.GBeanInfoBuilder; @@ -86,8 +88,12 @@ private Kernel kernel; private ServerInfo serverInfo; private ClassLoader classLoader; - private String[] autoMapPrincipals; + private Map autoMapPrincipals = new HashMap(); private Principal defaultPrincipal; + private Properties deploymentSupport; + private Map deployment; + private String[] domains; + private boolean restrictPrincipalsToServer; public GenericSecurityRealm(String realmName, Kernel kernel, ServerInfo serverInfo, Properties loginModuleConfiguration, ClassLoader classLoader) throws MalformedObjectNameException { this.realmName = realmName; @@ -95,6 +101,7 @@ this.serverInfo = serverInfo; this.classLoader = classLoader; processConfiguration(loginModuleConfiguration); + initializeDeployment(); } public String getRealmName() { @@ -106,6 +113,33 @@ } /** + * Gets a helper that lists principals for the realm to help with + * generating deployment descriptors. May return null if the realm does + * not support these features. + */ + public DeploymentSupport getDeploymentSupport(String domain) throws GeronimoSecurityException { + return (DeploymentSupport) deployment.get(domain); + } + + /** + * Gets a list of the login domains that make up this security realm. A + * particular LoginModule represents 0 or 1 login domains, and a realm is + * composed of a number of login modules, so the realm may cover any + * number of login domains, though typically that number will be 1. + */ + public String[] getLoginDomains() { + return domains; + } + + public Properties getDeploymentSupport() { + return deploymentSupport; + } + + public void setDeploymentSupport(Properties deploymentSupport) { + this.deploymentSupport = deploymentSupport; + } + + /** * Provides the default principal to be used when an unauthenticated * subject uses a container. * @@ -121,10 +155,14 @@ * * @return a set of principal class names */ - public Set obtainRolePrincipalClasses() { + public Set obtainRolePrincipalClasses(String loginDomain) { + String[] list = (String[]) autoMapPrincipals.get(loginDomain); + if(list == null) { + return Collections.EMPTY_SET; + } Set set = new HashSet(); - for (int i = 0; i < autoMapPrincipals.length; i++) { - set.add(autoMapPrincipals[i]); + for (int i = 0; i < list.length; i++) { + set.add(list[i]); } return set; } @@ -141,44 +179,29 @@ } } - public void setAutoMapPrincipalClasses(String classes) { - if (classes != null) { - autoMapPrincipals = classes.split(","); - } else { - autoMapPrincipals = new String[0]; - } - } - - /** - * @deprecated Will be removed in favor of (some kind of realm editor object) in - * a future milestone release. - */ - public Set getGroupPrincipals() throws GeronimoSecurityException { - return null; //todo - } - /** - * @deprecated Will be removed in favor of (some kind of realm editor object) in - * a future milestone release. + * Should be of the form loginDomain=class,class,class... */ - public Set getGroupPrincipals(RE regexExpression) throws GeronimoSecurityException { - return null; //todo + public void setAutoMapPrincipalClasses(Properties props) { + for (Iterator it = props.keySet().iterator(); it.hasNext();) { + String key = (String) it.next(); + String value = props.getProperty(key); + autoMapPrincipals.put(key, value.split(",")); + } } /** - * @deprecated Will be removed in favor of (some kind of realm editor object) in - * a future milestone release. + * A GBean property. If set to true, the login service will not return + * principals generated by this realm to clients. If set to false (the + * default), the client will get a copy of all principals (except realm + * principals generated strictly for use within Geronimo). */ - public Set getUserPrincipals() throws GeronimoSecurityException { - return null; //todo + public boolean isRestrictPrincipalsToServer() { + return restrictPrincipalsToServer; } - /** - * @deprecated Will be removed in favor of (some kind of realm editor object) in - * a future milestone release. - */ - public Set getUserPrincipals(RE regexExpression) throws GeronimoSecurityException { - return null; //todo + public void setRestrictPrincipalsToServer(boolean restrictPrincipalsToServer) { + this.restrictPrincipalsToServer = restrictPrincipalsToServer; } public String getConfigurationName() { @@ -190,11 +213,12 @@ options.put("realm", realmName); options.put("kernel", kernel.getKernelName()); - return new JaasLoginModuleConfiguration(realmName, JaasLoginCoordinator.class.getName(), LoginModuleControlFlag.REQUIRED, options, true); + return new JaasLoginModuleConfiguration(JaasLoginCoordinator.class.getName(), LoginModuleControlFlag.REQUIRED, options, true, realmName); } private void processConfiguration(Properties props) throws MalformedObjectNameException { int i = 1; + Set domains = new HashSet(); List list = new ArrayList(); LoginModuleControlFlagEditor editor = new LoginModuleControlFlagEditor(); while (true) { @@ -222,7 +246,14 @@ if (classLoader != null && !options.containsKey(CLASSLOADER_LM_OPTION)) { options.put(CLASSLOADER_LM_OPTION, classLoader); } - JaasLoginModuleConfiguration config = new JaasLoginModuleConfiguration(module.getObjectName(), module.getLoginModuleClass(), flag, options, module.isServerSide()); + if(module.getLoginDomainName() != null) { + if(domains.contains(module.getLoginDomainName())) { + throw new IllegalStateException("Error in "+realmName+": one security realm cannot contain multiple login modules for the same login domain"); + } else { + domains.add(module.getLoginDomainName()); + } + } + JaasLoginModuleConfiguration config = new JaasLoginModuleConfiguration(module.getLoginModuleClass(), flag, options, module.isServerSide(), module.getLoginDomainName()); list.add(config); ++i; found = true; @@ -233,9 +264,39 @@ break; } } + this.domains = (String[]) domains.toArray(new String[domains.size()]); config = (JaasLoginModuleConfiguration[]) list.toArray(new JaasLoginModuleConfiguration[list.size()]); } + private void initializeDeployment() { + deployment = new HashMap(); + for (int i = 0; i < config.length; i++) { + if(config[i].getLoginDomainName() == null) { + continue; + } + DeploymentSupport support = null; + if(deploymentSupport != null && deploymentSupport.containsKey(config[i].getLoginDomainName())) { + try { + //todo: how should this be configured? Should it be a GBean? + support = (DeploymentSupport) classLoader.loadClass(deploymentSupport.getProperty(config[i].getLoginDomainName())).newInstance(); + } catch (Exception e) { + throw new GeronimoSecurityException("Unable to load deployment support class '"+deploymentSupport.getProperty(config[i].getLoginDomainName())+"'", e); + } + } else if(config[i].getLoginModule(classLoader) instanceof DeploymentSupport) { + LoginModule module = config[i].getLoginModule(classLoader); + module.initialize(null, null, null, config[i].getOptions()); + support = (DeploymentSupport) module; + } + if(support != null) { + deployment.put(config[i].getLoginDomainName(), support); + String[] auto = support.getAutoMapPrincipalClassNames(); + if(auto != null) { + autoMapPrincipals.put(config[i].getLoginDomainName(), auto); + } + } + } + } + public static final GBeanInfo GBEAN_INFO; @@ -250,12 +311,15 @@ infoFactory.addAttribute("classLoader", ClassLoader.class, false); infoFactory.addAttribute("autoMapPrincipalClasses", String.class, true); infoFactory.addAttribute("defaultPrincipal", String.class, true); + infoFactory.addAttribute("deploymentSupport", Properties.class, true); + infoFactory.addAttribute("restrictPrincipalsToServer", boolean.class, true); infoFactory.addReference("ServerInfo", ServerInfo.class); infoFactory.addOperation("getAppConfigurationEntries", new Class[0]); infoFactory.addOperation("obtainDefaultPrincipal", new Class[0]); - infoFactory.addOperation("obtainRolePrincipalClasses", new Class[0]); + infoFactory.addOperation("obtainRolePrincipalClasses", new Class[]{String.class}); + infoFactory.addOperation("getDeploymentSupport", new Class[]{String.class}); infoFactory.setConstructor(new String[]{"realmName", "kernel", "ServerInfo", "loginModuleConfiguration", "classLoader"}); Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/SecurityRealm.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/SecurityRealm.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/SecurityRealm.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/SecurityRealm.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/SecurityRealm.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/SecurityRealm.java Mon Nov 22 18:03:22 2004 @@ -30,34 +30,39 @@ * @version $Rev$ $Date$ */ public interface SecurityRealm { - static final String BASE_OBJECT_NAME = "geronimo.security:type=SecurityRealm"; + /** + * The name of the realm, which must be unique across all realms in the + * server. + */ public String getRealmName(); - public JaasLoginModuleConfiguration[] getAppConfigurationEntries(); - /** - * @deprecated Will be removed in favor of (some kind of realm editor object) in - * a future milestone release. + * Gets the JAAS configuration for this security realm. */ - public Set getGroupPrincipals() throws GeronimoSecurityException; + public JaasLoginModuleConfiguration[] getAppConfigurationEntries(); /** - * @deprecated Will be removed in favor of (some kind of realm editor object) in - * a future milestone release. + * If this attribute is true, the login service will not return + * principals generated by this realm to clients. If set to false (the + * default), the client will get a copy of all principals (except realm + * principals generated strictly for use within Geronimo). */ - public Set getGroupPrincipals(RE regexExpression) throws GeronimoSecurityException; + public boolean isRestrictPrincipalsToServer(); /** - * @deprecated Will be removed in favor of (some kind of realm editor object) in - * a future milestone release. + * Gets a list of the login domains that make up this security realm. A + * particular LoginModule represents 0 or 1 login domains, and a realm is + * composed of a number of login modules, so the realm may cover any + * number of login domains, though typically that number will be 1. */ - public Set getUserPrincipals() throws GeronimoSecurityException; + public String[] getLoginDomains(); /** - * @deprecated Will be removed in favor of (some kind of realm editor object) in - * a future milestone release. + * Gets a helper that lists principals for the realm to help with + * generating deployment descriptors. May return null if the realm does + * not support these features. */ - public Set getUserPrincipals(RE regexExpression) throws GeronimoSecurityException; + public DeploymentSupport getDeploymentSupport(String loginDomain) throws GeronimoSecurityException; } Added: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/FileAuditLoginModule.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/FileAuditLoginModule.java?view=auto&rev=106257 ============================================================================== --- (empty file) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/FileAuditLoginModule.java Mon Nov 22 18:03:22 2004 @@ -0,0 +1,118 @@ +/** + * + * Copyright 2003-2004 The Apache Software Foundation + * + * Licensed 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.geronimo.security.realm.providers; + +import java.util.Map; +import java.util.Date; +import java.io.File; +import java.io.FileOutputStream; +import java.io.PrintWriter; +import java.io.IOException; +import java.nio.channels.FileChannel; +import java.nio.channels.FileLock; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import javax.security.auth.spi.LoginModule; +import javax.security.auth.Subject; +import javax.security.auth.login.LoginException; +import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.NameCallback; +import javax.security.auth.callback.Callback; +import org.apache.geronimo.system.serverinfo.ServerInfo; +import org.apache.geronimo.security.realm.GenericSecurityRealm; + +/** + * Writes audit records to a file for all authentication activity. Currently + * doesn't perform too well; perhaps the file management should be centralized + * and the IO objects kept open across many requests. It would also be nice + * to write in a more convenient XML format. + * + * This module does not write any Principals into the Subject. + * + * To enable this login module, set your primary login module to REQUIRED or + * OPTIONAL, and list this module after it (with any setting). + * + * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, 14 Sep 2004) $ + */ +public class FileAuditLoginModule implements LoginModule { + public static final String LOG_FILE_OPTION = "file"; + private final static DateFormat DATE_FORMAT = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); + private File logFile; + private CallbackHandler handler; + private String username; + + public void initialize(Subject subject, CallbackHandler callbackHandler, + Map sharedState, Map options) { + String name = (String) options.get(LOG_FILE_OPTION); + ServerInfo info = (ServerInfo) options.get(GenericSecurityRealm.SERVERINFO_LM_OPTION); + logFile = info.resolve(name); + handler = callbackHandler; + } + + public boolean login() throws LoginException { + NameCallback user = new NameCallback("User name:"); + Callback[] callbacks = new Callback[]{user}; + try { + handler.handle(callbacks); + } catch (Exception e) { + throw new LoginException("Unable to process callback: "+e); + } + if(callbacks.length != 1) { + throw new IllegalStateException("Number of callbacks changed by server!"); + } + user = (NameCallback) callbacks[0]; + username = user.getName(); + writeToFile("Authentication attempt"); + + return true; + } + + private synchronized void writeToFile(String action) { + Date date = new Date(); + try { + FileOutputStream out = new FileOutputStream(logFile, true); + FileChannel channel = out.getChannel(); + FileLock lock = channel.lock(0, Long.MAX_VALUE, false); + PrintWriter writer = new PrintWriter(out, false); + writer.println(DATE_FORMAT.format(date)+" - "+action+" - "+username); + writer.flush(); + writer.close(); + lock.release(); + } catch (IOException e) { + throw new RuntimeException("Unable to write to authentication log file", e); + } + } + + public boolean commit() throws LoginException { + writeToFile("Authentication succeeded"); + return true; + } + + public boolean abort() throws LoginException { + if(username != null) { //work around initial "fake" login + writeToFile("Authentication failed"); + username = null; + } + return true; + } + + public boolean logout() throws LoginException { + writeToFile("Explicit logout"); + username = null; + return true; + } +} Added: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/GeronimoGroupPrincipal.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/GeronimoGroupPrincipal.java?view=auto&rev=106257 ============================================================================== --- (empty file) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/GeronimoGroupPrincipal.java Mon Nov 22 18:03:22 2004 @@ -0,0 +1,67 @@ +/** + * + * Copyright 2003-2004 The Apache Software Foundation + * + * Licensed 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.geronimo.security.realm.providers; + +import java.io.Serializable; +import java.security.Principal; + +/** + * A principal that represents a group for the login modules distributed + * with Geronimo. Custom login modules may use this if convenient or provide + * their own Principal implementations -- it doesn't matter. + * + * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, 14 Sep 2004) $ + */ +public class GeronimoGroupPrincipal implements Principal, Serializable { + private final String name; + + public GeronimoGroupPrincipal(String name) { + this.name = name; + } + + /** + * Compares this principal to the specified object. Returns true + * if the object passed in is a GeronimoGroupPrincipal with the + * same name. + */ + public boolean equals(Object another) { + if (!(another instanceof GeronimoGroupPrincipal)) return false; + + return ((GeronimoGroupPrincipal) another).name.equals(name); + } + + /** + * Returns a string representation of this principal. + */ + public String toString() { + return name; + } + + /** + * Returns a hashcode for this principal. + */ + public int hashCode() { + return name.hashCode(); + } + + /** + * Returns the name of this principal. + */ + public String getName() { + return name; + } +} Added: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/GeronimoUserPrincipal.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/GeronimoUserPrincipal.java?view=auto&rev=106257 ============================================================================== --- (empty file) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/GeronimoUserPrincipal.java Mon Nov 22 18:03:22 2004 @@ -0,0 +1,67 @@ +/** + * + * Copyright 2003-2004 The Apache Software Foundation + * + * Licensed 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.geronimo.security.realm.providers; + +import java.io.Serializable; +import java.security.Principal; + +/** + * A principal that represents a user for the login modules distributed + * with Geronimo. Custom login modules may use this if convenient or provide + * their own Principal implementations -- it doesn't matter. + * + * @version $Rev: 46019 $ $Date: 2004-09-14 05:56:06 -0400 (Tue, 14 Sep 2004) $ + */ +public class GeronimoUserPrincipal implements Principal, Serializable { + private final String name; + + public GeronimoUserPrincipal(String name) { + this.name = name; + } + + /** + * Compares this principal to the specified object. Returns true + * if the object passed in is a GeronimoUserPrincipal with the + * same name. + */ + public boolean equals(Object another) { + if (!(another instanceof GeronimoUserPrincipal)) return false; + + return ((GeronimoUserPrincipal) another).name.equals(name); + } + + /** + * Returns a string representation of this principal. + */ + public String toString() { + return name; + } + + /** + * Returns a hashcode for this principal. + */ + public int hashCode() { + return name.hashCode(); + } + + /** + * Returns the name of this principal. + */ + public String getName() { + return name; + } +} Deleted: /geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/PropertiesFileGroupPrincipal.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/PropertiesFileGroupPrincipal.java?view=auto&rev=106256 ============================================================================== Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/PropertiesFileLoginModule.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/PropertiesFileLoginModule.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/PropertiesFileLoginModule.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/PropertiesFileLoginModule.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/PropertiesFileLoginModule.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/PropertiesFileLoginModule.java Mon Nov 22 18:03:22 2004 @@ -26,6 +26,7 @@ import java.util.Map; import java.util.Properties; import java.util.Set; +import java.util.HashMap; import javax.security.auth.Subject; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; @@ -39,6 +40,7 @@ import org.apache.geronimo.common.GeronimoSecurityException; import org.apache.geronimo.kernel.Kernel; import org.apache.geronimo.security.realm.GenericSecurityRealm; +import org.apache.geronimo.security.realm.DeploymentSupport; import org.apache.geronimo.system.serverinfo.ServerInfo; @@ -49,12 +51,12 @@ * * @version $Rev$ $Date$ */ -public class PropertiesFileLoginModule implements LoginModule { +public class PropertiesFileLoginModule implements LoginModule, DeploymentSupport { public final static String USERS_URI = "usersURI"; public final static String GROUPS_URI = "groupsURI"; private static Log log = LogFactory.getLog(PropertiesFileLoginModule.class); final Properties users = new Properties(); - final Properties groups = new Properties(); + final Map groups = new HashMap(); Subject subject; CallbackHandler handler; @@ -134,17 +136,17 @@ public boolean commit() throws LoginException { Set principals = subject.getPrincipals(); - principals.add(new PropertiesFileUserPrincipal(username)); + principals.add(new GeronimoUserPrincipal(username)); - Enumeration e = groups.keys(); - while (e.hasMoreElements()) { - String groupName = (String) e.nextElement(); + Iterator e = groups.keySet().iterator(); + while (e.hasNext()) { + String groupName = (String) e.next(); Set users = (Set) groups.get(groupName); Iterator iter = users.iterator(); while (iter.hasNext()) { String user = (String) iter.next(); if (username.equals(user)) { - principals.add(new PropertiesFileGroupPrincipal(groupName)); + principals.add(new GeronimoGroupPrincipal(groupName)); break; } } @@ -165,5 +167,38 @@ password = null; return true; + } + + /** + * Gets the names of all principal classes that may be populated into + * a Subject. + */ + public String[] getPrincipalClassNames() { + return new String[]{GeronimoUserPrincipal.class.getName(), GeronimoGroupPrincipal.class.getName()}; + } + + /** + * Gets the names of all principal classes that should correspond to + * roles when automapping. This is a default, and may be overridden + * by specific values configured for the realm. + */ + public String[] getAutoMapPrincipalClassNames() { + return new String[]{GeronimoGroupPrincipal.class.getName()}; + } + + /** + * Gets a list of all the principals of a particular type (identified by + * the principal class). These are available for manual role mapping. + */ + public String[] getPrincipalsOfClass(String className) { + Set s; + if(className.equals(GeronimoGroupPrincipal.class.getName())) { + s = groups.keySet(); + } else if(className.equals(GeronimoUserPrincipal.class.getName())) { + s = users.keySet(); + } else { + throw new IllegalArgumentException("No such principal class "+className); + } + return (String[]) s.toArray(new String[s.size()]); } } Deleted: /geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/PropertiesFileUserPrincipal.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/PropertiesFileUserPrincipal.java?view=auto&rev=106256 ============================================================================== Deleted: /geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/SQLGroupPrincipal.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/SQLGroupPrincipal.java?view=auto&rev=106256 ============================================================================== Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/SQLLoginModule.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/SQLLoginModule.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/SQLLoginModule.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/SQLLoginModule.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/SQLLoginModule.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/SQLLoginModule.java Mon Nov 22 18:03:22 2004 @@ -130,7 +130,7 @@ String userName = result.getString(2); if (cbUsername.equals(userName)) { - groups.add(new SQLGroupPrincipal(groupName)); + groups.add(new GeronimoGroupPrincipal(groupName)); } } } finally { @@ -151,7 +151,7 @@ public boolean commit() throws LoginException { Set principals = subject.getPrincipals(); - principals.add(new SQLUserPrincipal(cbUsername)); + principals.add(new GeronimoUserPrincipal(cbUsername)); Iterator iter = groups.iterator(); while (iter.hasNext()) { principals.add(iter.next()); Deleted: /geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/SQLUserPrincipal.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/realm/providers/SQLUserPrincipal.java?view=auto&rev=106256 ============================================================================== Modified: geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/util/ConfigurationUtil.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/util/ConfigurationUtil.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/util/ConfigurationUtil.java&r1=106256&p2=geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/util/ConfigurationUtil.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/util/ConfigurationUtil.java (original) +++ geronimo/trunk/modules/security/src/java/org/apache/geronimo/security/util/ConfigurationUtil.java Mon Nov 22 18:03:22 2004 @@ -46,7 +46,7 @@ * @param realmName the security realm that the principal belongs go * @return a RealmPrincipal from a deployment description */ - public static RealmPrincipal generateRealmPrincipal(final Principal principal, final String realmName) { + public static RealmPrincipal generateRealmPrincipal(final Principal principal, final String loginDomain, final String realmName) { try { return (RealmPrincipal) AccessController.doPrivileged(new PrivilegedExceptionAction() { public Object run() throws Exception { @@ -55,10 +55,14 @@ Constructor constructor = clazz.getDeclaredConstructor(new Class[]{String.class}); p = (java.security.Principal) constructor.newInstance(new Object[]{principal.getPrincipalName()}); - return new RealmPrincipal(realmName, p); + return new RealmPrincipal(loginDomain, p, realmName); } }); } catch (PrivilegedActionException e) { + e.printStackTrace(); + if(e.getException() != null) { + e.getException().printStackTrace(); + } return null; } } @@ -69,7 +73,7 @@ * @param realmName the security realm that the principal belongs go * @return a RealmPrincipal from a deployment description */ - public static PrimaryRealmPrincipal generatePrimaryRealmPrincipal(final Principal principal, final String realmName) { + public static PrimaryRealmPrincipal generatePrimaryRealmPrincipal(final Principal principal, final String loginDomain, final String realmName) { try { return (PrimaryRealmPrincipal) AccessController.doPrivileged(new PrivilegedExceptionAction() { public Object run() throws Exception { @@ -78,10 +82,14 @@ Constructor constructor = clazz.getDeclaredConstructor(new Class[]{String.class}); p = (java.security.Principal) constructor.newInstance(new Object[]{principal.getPrincipalName()}); - return new PrimaryRealmPrincipal(realmName, p); + return new PrimaryRealmPrincipal(loginDomain, p, realmName); } }); } catch (PrivilegedActionException e) { + e.printStackTrace(); + if(e.getException() != null) { + e.getException().printStackTrace(); + } return null; } } Modified: geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/AbstractTest.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/AbstractTest.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/AbstractTest.java&r1=106256&p2=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/AbstractTest.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/AbstractTest.java (original) +++ geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/AbstractTest.java Mon Nov 22 18:03:22 2004 @@ -69,6 +69,7 @@ testLoginModule = new ObjectName("geronimo.security:type=LoginModule,name=TestModule"); gbean.setAttribute("loginModuleClass", "org.apache.geronimo.security.bridge.TestLoginModule"); gbean.setAttribute("serverSide", new Boolean(true)); + gbean.setAttribute("loginDomainName", "TestLoginDomain"); kernel.loadGBean(testLoginModule, gbean); gbean = new GBeanMBean("org.apache.geronimo.security.realm.GenericSecurityRealm"); Modified: geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/ConfigurationEntryTest.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/ConfigurationEntryTest.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/ConfigurationEntryTest.java&r1=106256&p2=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/ConfigurationEntryTest.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/ConfigurationEntryTest.java (original) +++ geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/ConfigurationEntryTest.java Mon Nov 22 18:03:22 2004 @@ -56,15 +56,24 @@ protected ObjectName serverStub; public void test() throws Exception { + File log = new File("target/login-audit.log"); + if(log.exists()) { + log.delete(); + } + assertEquals("Audit file wasn't cleared", 0, log.length()); + + // First try with explicit configuration entry LoginContext context = new LoginContext("properties-client", new AbstractTest.UsernamePasswordCallback("alan", "starcraft")); context.login(); Subject subject = context.getSubject(); + Subject clientSubject = subject; assertTrue("expected non-null client subject", subject != null); Set set = subject.getPrincipals(IdentificationPrincipal.class); assertEquals("client subject should have one ID principal", set.size(), 1); IdentificationPrincipal idp = (IdentificationPrincipal)set.iterator().next(); + assertEquals(idp.getId(), idp.getId()); subject = ContextManager.getRegisteredSubject(idp.getId()); assertTrue("expected non-null server subject", subject != null); @@ -78,6 +87,9 @@ context.logout(); + assertNull(ContextManager.getRegisteredSubject(idp.getId())); + assertNull(ContextManager.getServerSideSubject(clientSubject)); + assertTrue("id of subject should be null", ContextManager.getSubjectId(subject) == null); // next try the automatic configuration entry @@ -86,6 +98,11 @@ context.login(); subject = context.getSubject(); assertTrue("expected non-null client subject", subject != null); + set = subject.getPrincipals(IdentificationPrincipal.class); + assertEquals("client subject should have one ID principal", set.size(), 1); + IdentificationPrincipal idp2 = (IdentificationPrincipal)set.iterator().next(); + assertNotSame(idp.getId(), idp2.getId()); + assertEquals(idp2.getId(), idp2.getId()); subject = ContextManager.getServerSideSubject(subject); assertTrue("expected non-null server subject", subject != null); @@ -100,6 +117,8 @@ context.logout(); assertTrue("id of subject should be null", ContextManager.getSubjectId(subject) == null); + + assertTrue("Audit file wasn't written to", log.length() > 0); } protected void setUp() throws Exception { @@ -146,12 +165,23 @@ props.put("usersURI", new File(new File("."), "src/test-data/data/users.properties").toURI().toString()); props.put("groupsURI", new File(new File("."), "src/test-data/data/groups.properties").toURI().toString()); gbean.setAttribute("options", props); + gbean.setAttribute("loginDomainName", "TestProperties"); + kernel.loadGBean(testCE, gbean); + + gbean = new GBeanMBean("org.apache.geronimo.security.jaas.LoginModuleGBean"); + testCE = new ObjectName("geronimo.security:type=LoginModule,name=audit"); + gbean.setAttribute("loginModuleClass", "org.apache.geronimo.security.realm.providers.FileAuditLoginModule"); + gbean.setAttribute("serverSide", new Boolean(true)); + props = new Properties(); + props.put("file", "target/login-audit.log"); + gbean.setAttribute("options", props); kernel.loadGBean(testCE, gbean); gbean = new GBeanMBean("org.apache.geronimo.security.realm.GenericSecurityRealm"); testRealm = new ObjectName("geronimo.security:type=SecurityRealm,realm=properties-realm"); gbean.setAttribute("realmName", "properties-realm"); props = new Properties(); + props.setProperty("LoginModule.2.OPTIONAL","geronimo.security:type=LoginModule,name=audit"); props.setProperty("LoginModule.1.REQUIRED","geronimo.security:type=LoginModule,name=properties"); gbean.setAttribute("loginModuleConfiguration", props); gbean.setReferencePatterns("ServerInfo", Collections.singleton(serverInfo)); Added: geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/DeploymentSupportTest.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/DeploymentSupportTest.java?view=auto&rev=106257 ============================================================================== --- (empty file) +++ geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/DeploymentSupportTest.java Mon Nov 22 18:03:22 2004 @@ -0,0 +1,169 @@ +/** + * + * Copyright 2003-2004 The Apache Software Foundation + * + * Licensed 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.geronimo.security.jaas; + +import javax.management.ObjectName; +import javax.security.auth.Subject; +import javax.security.auth.login.LoginContext; +import java.io.File; +import java.util.Collections; +import java.util.Properties; +import java.util.Set; +import java.util.List; +import java.util.Arrays; + +import org.apache.geronimo.gbean.jmx.GBeanMBean; +import org.apache.geronimo.security.AbstractTest; +import org.apache.geronimo.security.ContextManager; +import org.apache.geronimo.security.IdentificationPrincipal; +import org.apache.geronimo.security.RealmPrincipal; +import org.apache.geronimo.security.realm.SecurityRealm; +import org.apache.geronimo.security.realm.DeploymentSupport; +import org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal; +import org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal; +import org.apache.geronimo.system.serverinfo.ServerInfo; +import org.apache.geronimo.kernel.jmx.MBeanProxyFactory; +import org.apache.geronimo.kernel.Kernel; + +/** + * Unit test for the DeploymentSupport features of security realms. + * + * @version $Rev: 105949 $ $Date: 2004-11-20 02:38:55 -0500 (Sat, 20 Nov 2004) $ + */ +public class DeploymentSupportTest extends AbstractTest { + + protected ObjectName serverInfo; + protected ObjectName loginConfiguration; + protected ObjectName clientLM; + protected ObjectName clientCE; + protected ObjectName testCE; + protected ObjectName testRealm; + + public void setUp() throws Exception { + super.setUp(); + + GBeanMBean gbean; + + gbean = new GBeanMBean(ServerInfo.GBEAN_INFO); + serverInfo = new ObjectName("geronimo.system:role=ServerInfo"); + gbean.setAttribute("baseDirectory", "."); + kernel.loadGBean(serverInfo, gbean); + kernel.startGBean(serverInfo); + + gbean = new GBeanMBean("org.apache.geronimo.security.jaas.GeronimoLoginConfiguration"); + loginConfiguration = new ObjectName("geronimo.security:type=LoginConfiguration"); + kernel.loadGBean(loginConfiguration, gbean); + + gbean = new GBeanMBean("org.apache.geronimo.security.jaas.LoginModuleGBean"); + clientLM = new ObjectName("geronimo.security:type=LoginModule,name=properties-client"); + gbean.setAttribute("loginModuleClass", "org.apache.geronimo.security.jaas.JaasLoginCoordinator"); + gbean.setAttribute("serverSide", new Boolean(false)); + Properties props = new Properties(); + props.put("host", "localhost"); + props.put("port", "4242"); + props.put("realm", "properties-realm"); + gbean.setAttribute("options", props); + kernel.loadGBean(clientLM, gbean); + + gbean = new GBeanMBean("org.apache.geronimo.security.jaas.DirectConfigurationEntry"); + clientCE = new ObjectName("geronimo.security:type=ConfigurationEntry,jaasId=properties-client"); + gbean.setAttribute("applicationConfigName", "properties-client"); + gbean.setAttribute("controlFlag", LoginModuleControlFlag.REQUIRED); + gbean.setReferencePatterns("Module", Collections.singleton(clientLM)); + kernel.loadGBean(clientCE, gbean); + + gbean = new GBeanMBean("org.apache.geronimo.security.jaas.LoginModuleGBean"); + testCE = new ObjectName("geronimo.security:type=LoginModule,name=properties"); + gbean.setAttribute("loginModuleClass", "org.apache.geronimo.security.realm.providers.PropertiesFileLoginModule"); + gbean.setAttribute("serverSide", new Boolean(true)); + props = new Properties(); + props.put("usersURI", new File(new File("."), "src/test-data/data/users.properties").toString()); + props.put("groupsURI", new File(new File("."), "src/test-data/data/groups.properties").toString()); + gbean.setAttribute("options", props); + gbean.setAttribute("loginDomainName", "TestProperties"); + kernel.loadGBean(testCE, gbean); + + gbean = new GBeanMBean("org.apache.geronimo.security.realm.GenericSecurityRealm"); + testRealm = new ObjectName("geronimo.security:type=SecurityRealm,realm=properties-realm"); + gbean.setAttribute("realmName", "properties-realm"); + props = new Properties(); + props.setProperty("LoginModule.1.REQUIRED","geronimo.security:type=LoginModule,name=properties"); + gbean.setAttribute("loginModuleConfiguration", props); + gbean.setReferencePatterns("ServerInfo", Collections.singleton(serverInfo)); + kernel.loadGBean(testRealm, gbean); + + kernel.startGBean(loginConfiguration); + kernel.startGBean(clientLM); + kernel.startGBean(clientCE); + kernel.startGBean(testCE); + kernel.startGBean(testRealm); + } + + public void tearDown() throws Exception { + kernel.stopGBean(testRealm); + kernel.stopGBean(testCE); + kernel.stopGBean(clientCE); + kernel.stopGBean(clientLM); + kernel.stopGBean(loginConfiguration); + kernel.stopGBean(serverInfo); + + kernel.unloadGBean(testCE); + kernel.unloadGBean(testRealm); + kernel.unloadGBean(clientCE); + kernel.unloadGBean(clientLM); + kernel.unloadGBean(loginConfiguration); + kernel.unloadGBean(serverInfo); + + super.tearDown(); + } + + public void testDeploymentSupport() throws Exception { + SecurityRealm realm = (SecurityRealm) MBeanProxyFactory.getProxy(SecurityRealm.class, kernel.getMBeanServer(), testRealm); + String[] domains = realm.getLoginDomains(); + assertEquals(1, domains.length); + DeploymentSupport deployment = realm.getDeploymentSupport(domains[0]); + assertNotNull(deployment); + String[] classes = deployment.getPrincipalClassNames(); + assertEquals(2, classes.length); + if(classes[0].equals(GeronimoUserPrincipal.class.getName())) { + assertEquals(GeronimoGroupPrincipal.class.getName(), classes[1]); + } else if(classes[1].equals(GeronimoUserPrincipal.class.getName())) { + assertEquals(GeronimoGroupPrincipal.class.getName(), classes[0]); + } else { + fail("Unexpected principal class names "+classes[0]+" / "+classes[1]); + } + String[] names = deployment.getPrincipalsOfClass(GeronimoUserPrincipal.class.getName()); + assertEquals(5, names.length); + List list = Arrays.asList(names); + assertTrue(list.contains("izumi")); + assertTrue(list.contains("alan")); + assertTrue(list.contains("george")); + assertTrue(list.contains("gracie")); + assertTrue(list.contains("metro")); + names = deployment.getPrincipalsOfClass(GeronimoGroupPrincipal.class.getName()); + assertEquals(5, names.length); + list = Arrays.asList(names); + assertTrue(list.contains("manager")); + assertTrue(list.contains("it")); + assertTrue(list.contains("pet")); + assertTrue(list.contains("dog")); + assertTrue(list.contains("cat")); + String[] map = deployment.getAutoMapPrincipalClassNames(); + assertEquals(1, map.length); + assertEquals(GeronimoGroupPrincipal.class.getName(), map[0]); + } +} Modified: geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginPropertiesFileTest.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginPropertiesFileTest.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginPropertiesFileTest.java&r1=106256&p2=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginPropertiesFileTest.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginPropertiesFileTest.java (original) +++ geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginPropertiesFileTest.java Mon Nov 22 18:03:22 2004 @@ -31,7 +31,13 @@ import org.apache.geronimo.security.ContextManager; import org.apache.geronimo.security.IdentificationPrincipal; import org.apache.geronimo.security.RealmPrincipal; +import org.apache.geronimo.security.realm.SecurityRealm; +import org.apache.geronimo.security.realm.DeploymentSupport; +import org.apache.geronimo.security.realm.providers.GeronimoUserPrincipal; +import org.apache.geronimo.security.realm.providers.GeronimoGroupPrincipal; import org.apache.geronimo.system.serverinfo.ServerInfo; +import org.apache.geronimo.kernel.jmx.MBeanProxyFactory; +import org.apache.geronimo.kernel.Kernel; /** @@ -91,6 +97,7 @@ props.put("usersURI", new File(new File("."), "src/test-data/data/users.properties").toURI().toString()); props.put("groupsURI", new File(new File("."), "src/test-data/data/groups.properties").toURI().toString()); gbean.setAttribute("options", props); + gbean.setAttribute("loginDomainName", "TestProperties"); kernel.loadGBean(testCE, gbean); gbean = new GBeanMBean("org.apache.geronimo.security.realm.GenericSecurityRealm"); @@ -133,18 +140,22 @@ context.login(); Subject subject = context.getSubject(); - assertTrue("expected non-null client subject", subject != null); - Set set = subject.getPrincipals(IdentificationPrincipal.class); - assertEquals("client subject should have one ID principal", set.size(), 1); - IdentificationPrincipal idp = (IdentificationPrincipal)set.iterator().next(); - subject = ContextManager.getRegisteredSubject(idp.getId()); - assertTrue("expected non-null server subject", subject != null); - assertTrue("server subject should have one remote principal", subject.getPrincipals(IdentificationPrincipal.class).size() == 1); + assertTrue("expected non-null subject", subject != null); + assertTrue("subject should have one remote principal", subject.getPrincipals(IdentificationPrincipal.class).size() == 1); IdentificationPrincipal remote = (IdentificationPrincipal) subject.getPrincipals(IdentificationPrincipal.class).iterator().next(); - assertTrue("server subject should be associated with remote id", ContextManager.getRegisteredSubject(remote.getId()) != null); - assertTrue("server subject should have five principals", subject.getPrincipals().size() == 5); - assertTrue("server subject should have two realm principal", subject.getPrincipals(RealmPrincipal.class).size() == 2); + assertTrue("subject should be associated with remote id", ContextManager.getRegisteredSubject(remote.getId()) != null); + assertEquals("subject should have three principals ("+subject.getPrincipals().size()+")", 3, subject.getPrincipals().size()); + assertEquals("subject should have no realm principals ("+subject.getPrincipals(RealmPrincipal.class).size()+")", 0, subject.getPrincipals(RealmPrincipal.class).size()); + + subject = ContextManager.getServerSideSubject(subject); + + assertTrue("expected non-null subject", subject != null); + assertTrue("subject should have one remote principal", subject.getPrincipals(IdentificationPrincipal.class).size() == 1); + remote = (IdentificationPrincipal) subject.getPrincipals(IdentificationPrincipal.class).iterator().next(); + assertTrue("subject should be associated with remote id", ContextManager.getRegisteredSubject(remote.getId()) != null); + assertEquals("subject should have five principals ("+subject.getPrincipals().size()+")", 5, subject.getPrincipals().size()); + assertEquals("subject should have two realm principals ("+subject.getPrincipals(RealmPrincipal.class).size()+")", 2, subject.getPrincipals(RealmPrincipal.class).size()); RealmPrincipal principal = (RealmPrincipal) subject.getPrincipals(RealmPrincipal.class).iterator().next(); assertTrue("id of principal should be non-zero", principal.getId() != 0); Modified: geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginSQLTest.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginSQLTest.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginSQLTest.java&r1=106256&p2=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginSQLTest.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginSQLTest.java (original) +++ geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/LoginSQLTest.java Mon Nov 22 18:03:22 2004 @@ -93,6 +93,7 @@ props.put("userSelect", "SELECT UserName, Password FROM Users"); props.put("groupSelect", "SELECT GroupName, UserName FROM Groups"); gbean.setAttribute("options", props); + gbean.setAttribute("loginDomainName", "SQLDomain"); kernel.loadGBean(sqlModule, gbean); kernel.startGBean(sqlModule); Modified: geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/TimeoutTest.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/TimeoutTest.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/TimeoutTest.java&r1=106256&p2=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/TimeoutTest.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/TimeoutTest.java (original) +++ geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/jaas/TimeoutTest.java Mon Nov 22 18:03:22 2004 @@ -113,6 +113,7 @@ props.put("usersURI", new File(new File("."), "src/test-data/data/users.properties").toURI().toString()); props.put("groupsURI", new File(new File("."), "src/test-data/data/groups.properties").toURI().toString()); gbean.setAttribute("options", props); + gbean.setAttribute("loginDomainName", "PropertiesDomain"); kernel.loadGBean(testCE, gbean); gbean = new GBeanMBean("org.apache.geronimo.security.realm.GenericSecurityRealm"); Modified: geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/network/protocol/SubjectCarryingProtocolTest.java Url: http://svn.apache.org/viewcvs/geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/network/protocol/SubjectCarryingProtocolTest.java?view=diff&rev=106257&p1=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/network/protocol/SubjectCarryingProtocolTest.java&r1=106256&p2=geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/network/protocol/SubjectCarryingProtocolTest.java&r2=106257 ============================================================================== --- geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/network/protocol/SubjectCarryingProtocolTest.java (original) +++ geronimo/trunk/modules/security/src/test/org/apache/geronimo/security/network/protocol/SubjectCarryingProtocolTest.java Mon Nov 22 18:03:22 2004 @@ -285,6 +285,7 @@ props.put("usersURI", new File(new File("."), "src/test-data/data/users.properties").toURI().toString()); props.put("groupsURI", new File(new File("."), "src/test-data/data/groups.properties").toURI().toString()); gbean.setAttribute("options", props); + gbean.setAttribute("loginDomainName", "PropertiesDomain"); kernel.loadGBean(testCE, gbean); gbean = new GBeanMBean("org.apache.geronimo.security.realm.GenericSecurityRealm");