jueves, 9 de julio de 2009

¿ Como Configurar virtual host con Tomcat ?

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&amp;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.