Para configurar virtual host en Tomcat es muy fácil tenemos que seguir
los siguientes pasos:
Ir a el archivo server.xml ($CATALINA_HOME/conf/ ) y agregar los host
(en el ejemplo vamos a configurar prueba1.com y prueba2.com)
server.xml | Nuevo |
<Host unpackWARs="true" xmlValidation="false" ="false">
</Host> | <Host unpackWARs="true" xmlValidation="false" </Host>
<Host unpackWARs="true" xmlValidation="false" ="false"> </Host> |
Podemos ver que en prueba1.com se van a encontrar las aplicaciones
desplegadas en webapps y en prueba2.com las de otroWebapps.
Para poder probar su correcto funcionamiento agregamos la siguiente
entrada a /etc/host
127.0.0.1 localhost
prueba1.com prueba2.com
./etc/init.d/tomcat6
restart
Al ingresar a http://prueba1.com:8080 vera las aplicaciones deplogeadas en webapps y al ir http://prueba2.com:8080 las de otroWebapps.
¿ Como Configuración de Realms ?
En Apache Tomcat no existe el concepto htaccess como se entiende en Apache. Para obtener este comportamiento se deben configurar realms.
Un realm es una “base de datos” de usuarios y passwords que nos sirve para implementar un mecanismo de autenticación para
aplicaciones Web. Se puede pensar en roles similar a grupos
de unix/linux, y se puede dar permisos de acceso a un recurso a un grupo.
org.apache.catalina.Realm
; se puede implementar “plug in” para establecer esta conexión.
Tomcat provee 5 formas estándares para autenticación:
JDBCRealm:
Autenticación contra una base de datos relacional usando driver jdbc.
-
<Realm className="org.apache.catalina.realm.JDBCRealm"
debug="99"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/authority? user=dbuser&password=dbpass"
userTable="users"
userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>
Para el ejemplo se debe tener las siguientes tablas en la base de datos:
create table users (
user_name varchar(15) not null primary key,
user_pass varchar(15) not null
);
create table user_roles (
user_name varchar(15) not null,
role_name varchar(15) not null,
primary key (user_name, role_name)
);
DataSourceRealm:
Autenticación contra una base de datos relacional, accedida vía un
nombre JNDI JDBC DataSource.
<Realm className="org.apache.catalina.realm.DataSourceRealm"
debug="99"
dataSourceName="jdbc/authority"
userTable="users"
userNameCol="user_name"
userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>
Para el ejemplo se debe tener las siguientes tablas en la base de datos:
create table users (
user_name varchar(15) not null primary key,
user_pass varchar(15) not null
);
create table user_roles (
user_name varchar(15) not null,
role_name varchar(15) not null,
primary key (user_name, role_name)
);
JNDIRealm:
Autenticación contra una base de datos LDAP, accedida vía un nombre JNDI provider.
<Realm className="org.apache.catalina.realm.JNDIRealm" debug="99"
connectionURL="ldap://localhost:389"
userPattern="uid={0},ou=people,dc=mycompany,dc=com"
roleBase="ou=groups,dc=mycompany,dc=com"
roleName="cn"
roleSearch="(uniqueMember={0})"
/>
Para el ejemplo se debe tener las siguientes estructura en el ldap:
# Define top-level entry
dn: dc=mycompany,dc=com
objectClass: dcObject
dc:mycompany
# Define an entry to contain people
# searches for users are based on this entry
dn: ou=people,dc=mycompany,dc=com
objectClass: organizationalUnit
ou: people
# Define a user entry for Janet Jones
dn: uid=jjones,ou=people,dc=mycompany,dc=com
objectClass: inetOrgPerson
uid: jjones
sn: jones
cn: janet jones
mail: j.jones@mycompany.com
userPassword: janet
# Define a user entry for Fred Bloggs
dn: uid=fbloggs,ou=people,dc=mycompany,dc=com
objectClass: inetOrgPerson
uid: fbloggs
sn: bloggs
cn: fred bloggs
mail: f.bloggs@mycompany.com
userPassword: fred
# Define an entry to contain LDAP groups
# searches for roles are based on this entry
dn: ou=groups,dc=mycompany,dc=com
objectClass: organizationalUnit
ou: groups
# Define an entry for the "tomcat" role
dn: cn=tomcat,ou=groups,dc=mycompany,dc=com
objectClass: groupOfUniqueNames
cn: tomcat
uniqueMember: uid=jjones,ou=people,dc=mycompany,dc=com
uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com
# Define an entry for the "role1" role
dn: cn=role1,ou=groups,dc=mycompany,dc=com
objectClass: groupOfUniqueNames
cn: role1
uniqueMember: uid=fbloggs,ou=people,dc=mycompany,dc=com
Autenticación contra una colección de objetos user que se
encuentran en memoria estos usuarios se cargan al iniciar el servidor del archivo conf/tomcat-users.xml
<Realm className="org.apache.catalina.realm.MemoryRealm"
pathname="$CATALINA_HOME/conf/tomcat-users.xml"
/>
$CATALINA_HOME/conf/tomcat-users.xml
-
<tomcat-users>
<user name="tomcat" password="tomcat" roles="tomcat" />
<user name="role1" password="tomcat" roles="role1" />
<user name="both" password="tomcat" roles="tomcat,role1" />
</tomcat-users>
JAASRealm:
Autenticación usando Java Authentication & Authorization
Service (JAAS) framework.
<Realm className="org.apache.catalina.realm.JAASRealm"
appName="MyFooRealm"
userClassNames="org.foobar.realm.FooUser"
roleClassNames="org.foobar.realm.FooRole"
debug="99" />
Pero también es posible escribir nuestras propias implementaciones y integrarlas con tomcat, para esto necesitaremos:
Implementar org.apache.catalina.Realm.
Agregar el jar en $CATALINA_HOME/lib
Declarar el realm.
Declarar el realm en el Mbeans Descriptor.
Luego
de entender como el funcionamiento de los Reamls vamos a explicar como se configuran:
Se debe agregar el tag Realm
<Realm
className="... clase que implementaorg.apache.catalina.Realm
"
...
otros atributos.../>
El elemento Realm puede estar contenido en los siguientes elementos:
Dentro de un elemento <Engine>:
Este elemento es compartido por todos los virtual host y
todas las aplicaciones web. Se puede pisar con los realms
configurados en<Host>
o<Context>.
Dentro de un elemento
<Host>:
Este elemento es por virtual host y todas las aplicaciones web que se encuentran en el mismo. Se puede pisar con los realms configurados en<Context>.
Dentro de un elemento
<Context>
:
Este elemento es por aplicación web.