Hello I have problem with configuring JBoss 4.2.1+Seam 2.0.1+Oracle 10 to use one data source with multiple users. I have configured *-ds.xml file with
| <datasources> | <local-tx-datasource> | <jndi-name>myDatasource</jndi-name> | <connection-url>jdbc:oracle:thin:@server:1521:db</connection-url> | <driver-class>oracle.jdbc.driver.OracleDriver</driver-class> | <security-domain>MyRealm</security-domain> | </local-tx-datasource> | </datasources> | and added to login-config.xml: | <authentication> | <login-module code = "my.login.module.MyLoginModule" flag = "required"> | <module-option name="sysUserName">user</module-option> | <module-option name="sysPassword">pass</module-option> | <module-option name="managedConnectionFactoryName">jboss.jca:service=LocalTxCM,name=myDatasource</module-option> | </login-module> | </authentication> | my login module code is as follows: | import java.security.AccessController; | import java.security.Principal; | import java.security.PrivilegedAction; | import java.security.acl.Group; | import java.util.Map; | | import javax.management.MBeanServer; | import javax.management.MBeanServerFactory; | import javax.management.MalformedObjectNameException; | import javax.management.ObjectName; | import javax.resource.spi.ManagedConnectionFactory; | import javax.resource.spi.security.PasswordCredential; | import javax.security.auth.Subject; | import javax.security.auth.callback.CallbackHandler; | import javax.security.auth.login.LoginException; | | import org.jboss.mx.util.MBeanServerLocator; | import org.jboss.seam.security.Identity; | import org.jboss.security.SecurityAssociation; | import org.jboss.security.SimplePrincipal; | import org.jboss.security.auth.spi.AbstractServerLoginModule; | | public class MyLoginModule extends AbstractServerLoginModule { | | private static final org.apache.log4j.Logger log = org.apache.log4j.Logger | .getLogger(my.login.module.MyLoginModule.class); | | /* used at jboss startup */ | private static boolean sysMode = true; | | private String sysUserName; | private String sysPassword; | private String userName; | private String password; | | private MBeanServer server; | private ObjectName managedConnectionFactoryName; | private ManagedConnectionFactory mcf; | | public SkorLoginModule() {} | | @Override | public void initialize(Subject subject, CallbackHandler handler, Map sharedState, Map options) { | | super.initialize(subject, callbackHandler, sharedState, options); | | String name = (String) options.get("managedConnectionFactoryName"); | try { | managedConnectionFactoryName = new ObjectName(name); | } catch (MalformedObjectNameException mone) { | throw new IllegalArgumentException("Malformed ObjectName: " + name); | } | | sysUserName = (String)options.get("sysUserName"); | if (sysUserName == null) { | throw new IllegalArgumentException("Must supply a system user name!"); | } | userName = (String)options.get("sysUserName"); | | sysPassword = (String)options.get("sysPassword"); | if (sysPassword == null) { | throw new IllegalArgumentException("Must supply a system user password!"); | } | password = (String)options.get("sysPassword"); | | server = MBeanServerLocator.locateJBoss(); | getMcf(); | } | | @Override | public boolean login() throws LoginException { | | setUserNameAndPassword(); | log.info("login(): userName=" + userName + ", sysMode=" + sysMode); | | Principal principal = new SimplePrincipal(userName); | | PasswordCredential credential = new | PasswordCredential(userName, password.toCharArray()); | credential.setManagedConnectionFactory(getMcf()); | | subject.getPrincipals().add(principal); | subject.getPrivateCredentials().add(credential); | | super.loginOk = true; | return true; | } | | protected ManagedConnectionFactory getMcf() { | | if (mcf == null) { | try { | mcf = (ManagedConnectionFactory)server.getAttribute(managedConnectionFactoryName, "ManagedConnectionFactory"); | } catch (Exception e) { | throw new IllegalArgumentException("Managed Connection Factory not found: " + managedConnectionFactoryName); | } | } | return mcf; | } | | @Override | protected Principal getIdentity() { | | setUserNameAndPassword(); | log.info("getIdentity(): userName=" + userName + ", sysMode=" + sysMode); | | return new SimplePrincipal(userName); | } | | @Override | protected Group[] getRoleSets() throws LoginException { | return new Group[] {}; | } | | private void setUserNameAndPassword() { | if (sysMode) { | userName = sysUserName; | password = sysPassword; | } else { | String[] ss = Identity.instance().getUsername().split(" "); | String s = ss[0].substring(0, 1).toLowerCase(); | s += ss[1].toLowerCase(); | userName = s; | password = s; | } | } | } | The problem is that when I try to switch user with: | org.jboss.seam.security.Identity.instance().setUsername("User Name"); | SkorLoginModule.setSysMode(false); | try { | LoginContext loginContext = new LoginContext("MyRealm"); | loginContext.login(); | } catch (LoginException e) { | System.out.println("error"); | } | | there aren't created any sub-pools for every user. There is one physical db connection. When I try to flush cache from JaasSecurityManager, the connection i reseted and previously logged in user is disconnected. Another question is: when should I invoke loginContext.login() because now it's invoked in a stateless bean which authenticate method is configured in seam's compoments.xml file as: | <security:identity authenticate-method="#{authenticator.authenticate}" | security-rules="#{securityRules}"/> | I think the authenticate method should be invoked somewhere else - in authenticator bean the entity manager is already injected by @PersistenceContext annotation. Thanks in advance for any help. View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4151703#4151703 Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4151703 _______________________________________________ jboss-user mailing list jboss-user@lists.jboss.org https://lists.jboss.org/mailman/listinfo/jboss-user