You are on page 1of 8

Mario  Hernando  Martín  -­‐  Guia  JAAS  +  Apache  Tomcat   Elementos  necesarios  :     -­‐  Servidor  Apache  +  php     -­‐  Carpeta  apache-­‐tomcat

-­‐6.0.35  (no  necesariamente  esta  versión)     1  :  Descargar  e  instalar  Apache  Tomcat     En  primer  lugar  ,  nos  dirigimos  a  la  pagina  oficial  del  proyecto  Apache  Tomcat   (tomcat.apache.org)  y  nos  descargamos  una  versión  (en  nuestro  caso  hemos   escogido  la  versión  6)  .  Una  vez  descargada  ,  la  descomprimimos  ,  y  copiamos  el   directorio  completo  a  /opt.       Para  hacerlo  funcionar  ,  nos  dirigimos  a  /opt/apache-­‐tomcat-­‐6.0.35/bin  ,  y  una  vez   dentro  de  este  directorio  ,  editamos  el  archivo  catalina.sh  ,  dentro  de  este  archivo   introducimos  al  principio  la  siguiente  línea  :       JRE_HOME="/usr"     Ahora  ,  en  el  mismo  directorio  donde  estábamos  situados  ,  (/opt/apache-­‐tomcat-­‐ 6.0.35/bin)  ,  introducimos  el  siguiente  comando  para  iniciar  el  servidor  apache   tomcat  :       ./startup.sh     De  modo  que  la  consola  de  comandos  nos  debería  mostrar  el  siguiente  resultado  :    

    Una  vez  efectuados  estos  pasos  ,  ya  podemos  abrir  el  navegador  i  introducir  la  url  :   http://localhost:8080  ,  si  todos  los  pasos  anteriores  se  han  ejecutado   correctamente  ,  se  nos  debería  mostrar  la  siguiente  pantalla  en  el  navegador  :    

 

 

PasswordCallback.LoginException.security.io.util. */ private CallbackHandler handler.  necesitamos  introducir  el  concepto  de  rol  (que  en  JAAS  técnicamente  no   existe)  .java       Como  se  aprecia  en  el  siguiente  código  .auth.callback.security. /** Subject to store.security.LoginModule#abort() */ @Override public boolean abort() throws LoginException { return false. java.Subject. public class PlainLoginModule implements LoginModule { /** Callback handler to store between initialization and authentication.login.  la  autenticación  falla  cuando  el  usuario   introduce  un  usuario  distinto  de  la  contraseña  .callback. javax.callback.security.auth.java  serán  los  siguientes  :     PlainLoginModule.auth.Map.  necesitaremos  un  LoginModule  para  implementar  la   autenticación  . /** * This implementation always return false. javax.auth.callback. javax. /** Login name.security. } /** * This is where.  y  un   segundo  Principal  que  llevara  a  cabo  la  identidad  del  grupo  o  rol. javax.auth.LoginModule.spi. */ private String login.UnsupportedCallbackException.security.callback.  y  un  Principal  que  llevara  a  cabo  la  identidad  el  usuario  . should the entire authentication process succeeds.NameCallback.     Estos  3  ficheros  .IOException.security.  podemos   introducir  la  lectura  de  un  fichero  de  contraseñas  y  establecer  nuevos   condicionantes  para  la  autenticación     import import import import import import import import import import java.spi.auth. * .  En  conclusión  .CallbackHandler.auth. javax. javax.Mario  Hernando  Martín  -­‐  Guia  JAAS  +  Apache  Tomcat   2  -­‐  Configuraciones  JAAS     Para  poder  llevar  la  autenticación  y  autorización  de  JAAS  al  servidor  Apache   Tomcat  . * principal would be set.auth.auth. * * @see javax.Callback.security.security. javax. javax.  variando  este  concepto  . */ private Subject subject.

CallbackHandler aCallbackHandler.util.LoginModule#login() */ @Override public boolean login() throws LoginException { Callback[] callbacks = new Callback[2].getName().add(user).LoginModule#initialize(javax.security.Map) */ @Override public void initialize(Subject aSubject.getPrincipals().callback.Mario  Hernando  Martín  -­‐  Guia  JAAS  +  Apache  Tomcat   * @see javax.spi. } /** * This method checks whether the name and the password are the same. java.Sub ject.getPrincipals(). * * @see javax.auth. callbacks[1] = new PasswordCallback("password".add(role).security.spi. Map aSharedState. * java. subject. String password = String. return true. . PlainRolePrincipal role = new PlainRolePrincipal("tomcat"). subject.LoginModule#commit() */ @Override public boolean commit() throws LoginException { try { PlainUserPrincipal user = new PlainUserPrincipal(login).util.auth. callbacks[0] = new NameCallback("login").auth.security. } } /** * This implementation ignores both state and options.security.spi. try { handler. } catch (Exception e) { throw new LoginException(e.security.auth.Map. String name = ((NameCallback) callbacks[0]).auth.handle(callbacks).getMessage()). subject = aSubject.valueOf(((PasswordCallback) callbacks[1]). Map aOptions) { handler = aCallbackHandler.getPassword()).CallbackHandler. true). * javax. * * @see javax.

getMessage()). subject.auth. } public String getName() { . } } /** * Clears subject from principal and credentials. subject.getPrincipals().remove(user). } login = name.security. return true. public PlainRolePrincipal(String name) { roleName = name.security.equals(password)) { throw new LoginException("Authentication failed"). } } }     PlainRolePrincipal. return true. PlainRolePrincipal role = new PlainRolePrincipal("tomcat").java     import java.getPrincipals(). * * @see javax.spi. } catch (UnsupportedCallbackException e) { throw new LoginException(e.LoginModule#logout() */ @Override public boolean logout() throws LoginException { try { PlainUserPrincipal user = new PlainUserPrincipal(login).Mario  Hernando  Martín  -­‐  Guia  JAAS  +  Apache  Tomcat   if (!name.Principal. public class PlainRolePrincipal implements Principal { String roleName. } catch (Exception e) { throw new LoginException(e.getMessage()). } catch (IOException e) { throw new LoginException(e.getMessage()).remove(role).

} public boolean equals(Object obj) { if (this == obj) { return true. } public int hashCode() { return roleName. } public String getName() { return UserName. } }     PlainUserPrincipal.equals(other.roleName).UserName).Mario  Hernando  Martín  -­‐  Guia  JAAS  +  Apache  Tomcat   return roleName. return roleName.Principal. } }     . } if (obj instanceof PlainUserPrincipal) { PlainUserPrincipal other = (PlainUserPrincipal) obj. } public int hashCode() { return UserName. } if (obj instanceof PlainRolePrincipal) { PlainRolePrincipal other = (PlainRolePrincipal) obj. } public boolean equals(Object obj) { if (this == obj) { return true.hashCode().hashCode(). return UserName.security. public class PlainUserPrincipal implements Principal { String UserName.equals(other. } public String toString() { return ("RolePrincipal: " + roleName). } public String toString() { return ("UserPrincipal: " + UserName). } return false.java     import java. } return false. public PlainUserPrincipal(String name) { UserName = name.

config     Ahora  es  el  momento  de  configurar  las  opciones  de  seguridad  y  roles  utilizados   para  Apache  Tomcat  .  en  los  siguientes  pasos  donde  configuraremos  el  propio  servidor  .  introducimos  todos  los  archivos  compilados  en  el  directorio  :     /opt/apache-­‐tomcat-­‐6.config  creado  .java PlainRolePrincipal.config=$CATALINA_HOME/conf/jaas.  los  compilamos  mediante  el  comando  :     javac PlainLoginModule.auth.   deberemos  tener  en  cuenta  el  nombre  que  hemos  introducido  aquí.  tenemos  que  introducirlo  en  el   directorio  :   /opt/apache-­‐tomcat-­‐6.sh  .Mario  Hernando  Martín  -­‐  Guia  JAAS  +  Apache  Tomcat   Una  vez  tengamos  los  3  ficheros  .  y  creamos  dentro  de  este  directorio   un  archivo  llamado  setenv.  y  su  contenido  será  el  siguiente  :     prova{ PlainLoginModule required debug=true.  donde  se   encuentra  nuestro  archivo  de  configuración  jaas.sh  para  iniciar  la   variable  de  entorno  que  ejecuta  el  jaas.  donde  introducimos  el  siguiente  contenido  :     export  CATALINA_OPTS=-­‐Djava.     Una  vez  tengamos  el  fichero  jaas.  este  será  llamado   jaas.0./startup.0.  para  ello  tenemos  que  modificar  el  fichero  web.config  .     En  este  caso  hemos  introducido  prova  .java   Una  vez  compilados  .login.config  ./setenv.35/conf     3  -­‐  Configurando  el  servidor  Apache  Tomcat     Lo  primero  que  tenemos  que  hacer  es  decirle  al  servidor  apache  tomcat  .sh  .35/bin  . }.35/lib     Ahora  es  el  momento  de  crear  nuestro  fichero  de  configuración  .config     De  esta  manera  le  estamos  diciendo  donde  tiene  que  buscar  el  fichero  jaas.xml  e   introducir  el  siguiente  código  después  de  la  etiqueta  que  abre  la  web-­‐app  :     <security-constraint> <display-name>Example security constraint</display-name> <web-resource-collection> <web-resource-name>Protected Area</web-resource-name> <url-pattern>/jsp/security/protected/*</url-pattern> <http-method>DELETE</http-method> <http-method>GET</http-method> <http-method>POST</http-method> <http-method></http-method> </web-resource-collection> <auth-constraint> .   hay  que  tener  en  cuenta  que  cada  vez  que  iniciemos  el  servidor  apache  tomcat   mediante  .java  .security.java PlainUserPrincipal.  pero  podemos  introducir  el  nombre  que   queramos  .config  .  también  tendremos  que  ejecutar  .  para  ello  nos  dirigimos  al   directorio  :  /opt/apache-­‐tomcat-­‐6.0.

config     Por  ultimo  .  en  security-­‐roles  podemos  establecer  los  roles  existentes.realm.sh  que  debemos  ejecutar   en  la  ruta  /opt/apache-­‐tomcat-­‐6.  en  el  JAAS  realm  seria  conveniente  añadir  un  fichero  de   roles  .  es  el  momento  de  encender  el   Apache  tomcat  .JAASRealm" appName="prova" userClassNames="PlainUserPrincipal" roleClassNames="PlainRolePrincipal" />   Nota  :  El  nombre  de  appName  debe  coincidir  con  el  nombre  que  hemos  dado  en  el   fichero  jaas.xml  que  se  encuentra  en  la   carpeta  conf  .  usuarios  y  contraseñas  que  sea  leído  desde  el  LoginModule).  mediante  el  comando  startup.  para  ello  debemos  modificar  el  fichero   server.  nos  indica  la  parte  que  queremos  proteger  .catalina.Mario  Hernando  Martín  -­‐  Guia  JAAS  +  Apache  Tomcat   <role-name>tomcat</role-name> <role-name>role1</role-name> </auth-constraint> </security-constraint> <login-config> <auth-method>FORM</auth-method> <realm-name>exemple</realm-name> <form-login-config> <form-login-page>/jsp/security/protected/login.     4  -­‐  Ejecutando  nuestra  aplicación       Una  vez  ejecutados  todos  los  pasos  anteriores  .jsp</formlogin-page> <form-error-page>/jsp/security/protected/error.  para  establecer  los  usuarios  y  sus  roles  (esto  es  efectivo  en  Realms   de  tipo  Memory  Realm  .  debemos  modificar  el  fichero  tomcat-­‐users.35/bin     Abrimos  nuestro  navegador  y  nos  dirigimos  a  la  siguiente  url  :   http://localhost:8080/examples/jsp/security/protected   .jsp</formerror-page> </form-login-config> </login-config> <security-role> <role-name>role1</role-name> </security-role> <security-role> <role-name>tomcat</role-name> </security-role>   La  etiqueta  URL-­‐Pattern  .xml  y  modificar  la  parte  de  código  que  indica  el  Realm  por  defecto  (Memory   Realm  )  e  introducirle  nuestro  JAASRealm  que  será  el  siguiente  :     <Realm className="org.     Ahora  nos  toca  crear  nuestro  JAASRealm  .0.apache.sh  y  setenv.  mediante  el   form-­‐login-­‐config  podemos  introducir  la  pagina  de  login  así  como  la  pagina  de   error  .

 si  este  esta  bien  autenticado  podremos  comprobar  sus  roles  (hay  que   tener  en  cuenta  las  configuraciones  anteriormente  introducidas  y  el  formato  del   LoginModule  para  entender  el  funcionamiento  de  la  aplicación)     Pagina  de  login:       Resultado  del  login  iniciándonos  como  tomcat/tomcat  :                 .  en  el  podemos  introducir  el  usuario  y  la   contraseña  .Mario  Hernando  Martín  -­‐  Guia  JAAS  +  Apache  Tomcat     Nos  aparecerá  un  formulario  de  login  .