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 original |
Nuevo server.xml |
<Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware ="false">
</Host> |
<Host name="prueba1.com" appBase="webapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host>
<Host name="prueba2.com" appBase="otroWebapps" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware ="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 |
Para que tome las url, luego reinicie el servidor.
./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.
En muchos casos es deseable que se autentique con mecanismos ya implementados dentro de una aplicación. Para esto Apache tomcat define una serie interfaces java que se encuentran en el paquete
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 |
MemoryRealm:
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" /> |
Para el ejemplo se debe agregar los usuarios a
$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 implementa
org.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.