Seguridad en Apache Tomcat
Seguridad en aplicaciones web con Apache Tomcat
Apache Tomcat permite añadir seguridad a un proyecto mediante la denominada seguridad basada en contenedores (Container Managed Security). Debido a la coincidencia de sus siglas (CMS) es preciso mencionar que este tipo de seguridad no guarda ninguna relación con los conocidos Content Management System (Sistemas de gestión de contenido) también llamados popularmente gestores de contenido (Wordpress, Blogger, Joomla, etc...).
Esta seguridad permite la configuración de usuarios, contraseñas y roles en una base de datos, definida en el archivo web.xml. Esta configuración de seguridad se basa en dos etiquetas:
<role rolename="role1"/>
<role rolename="role2"/>
<user username="user1" password="pass1" roles="role1"/>
<user username="user2" password="pass2" roles="role1,role2"/>
A continuación se realiza la restricción de las rutas asociando los roles ya definidos mediante el archivo web.xml
<security-constraint>
<display-name>Ruta protegida</display-name>
<web-resource-collection>
<web-resource-name>Nombre de la ruta</web-resource-name>
<url-pattern>/directorio1/*</url-pattern>
<url-pattern>/users.jsp</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>role1</role-name>
</auth-constraint>
</security-constraint>
Es necesario tener en cuenta algunos aspectos para este tipo de configuración:
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<login-config>
<auth-method>FORM</auth-method>
<form-login-config>
<form-login-page>/login.jsp</form-login-page>
<form-error-page>/error.jsp</form-error-page>
</form-login-config>
</login-config>
<form action='j_security_check' method='POST'>
<input name='j_username'>
<input type='password' name='j_password'>
<input type='submit' >
</form>
<form name="form" action="j_security_check" method="POST">
<div class="form-group">
<label for="j_username">Usuario</label>
<input name="j_username" type="text" class="form-control" placeholder="Nombre">
</div>
<div class="form-group">
<label for="j_password">Contraseña</label>
<input type="password" name="j_password" class="form-control" placeholder="Contraseña">
<button type="submit" class="btn btn-success">Acceder</button>
</div>
</form>
El archivo de error solamente se diferencia del archivo de login en que debe contener algún mensaje que indique un error de autenticación en el formulario.
<div class="bg-danger">
El usuario o la contraseña no son correctos
</div>
<form name="form" action="j_security_check" method="POST">
<div class="form-group">
<label for="j_username">Usuario</label>
<input name="j_username" type="text" class="form-control" placeholder="Nombre">
</div>
<div class="form-group">
<label for="j_password">Contraseña</label>
<input type="password" name="j_password" class="form-control" placeholder="Contraseña">
<button type="submit" class="btn btn-success">Acceder</button>
</div>
</form>
El archivo context.xml debe configurarse añadiendo los datos de conexión, el nombre de la base de datos, de las tablas y los campos para poder relacionarlas. El código siguiente permite el acceso a una ruta especificando los datos de conexión, la base de datos y los datos requeridos de las dos tablas anteriores, además, encriptando con MD5 la contraseña introducida al enviar el formulario.
<?xml version="1.0" encoding="UTF-8"?>
<Context path="/home">
<Realm className="org.apache.catalina.realm.JDBCRealm"
connectionName="admin" connectionPassword="admin"
connectionURL="jdbc:mysql://localhost/sistemaJDBC"
driverName="com.mysql.cj.jdbc.Driver"
digest="MD5"
roleNameCol="role"
userCredCol="password"
userNameCol="user"
userRoleTable="role_user"
userTable="user">
<CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler"
algorithm="MD5"
iterations="1"
saltlength="0"/>
</Realm>
</Context>
Para poder comentar es necesario iniciar sesión