Estructura de las Páginas JSP
- Accediendo a MySQL

En esta sección comenzaremos a trabajar con la base de datos MySQL: Cómo accederla desde un programa en Java y desde una página JSP.


1. La Seguridad en MySQL

La seguridad en MySQL está basada en Listas de Control de Acceso (Access Control Lists - ACL) para todas las conexiones, consultas y otras operaciones que el usuario intente realizar.

La función principal del sistema de privilegios consiste en autenticar a un usuario conectándose desde un host dado, y asociar a ese usuario con los privilegios en una base de datos (tales como seleccionar, insertar, actualizar o borrar). Una funcionalidad adicional incluye la habilidad de tener un usuario anónimo y otorgarle privilegios a funciones específicas (tales como cargar datos de un archivo), y operaciones administrativas.

El sistema de privilegios asegura que todos los usuarios puedan hacer exactamente lo que se supone les está permitido hacer. Cuando un usuario se conecta al servidor MySQL, su identidad se determina por el host desde el que se está conectando y por el nombre de usuario especificado. Es con base en la identidad y la actividad a realizar, que el sistema otorga los privilegios. Es importante notar que MySQL considera ambos, tanto el nombre del host como del usuario para identificar a un usuario dado.

El control de acceso involucra dos etapas:

  1. El servidor revisa si al usuario le está permitido conectarse.
  2. Asumiendo que la conexión fue permitida, el servidor revisa cada petición realizada para comprobar que se tienen los privilegios suficientes para realizarla.

    Por ejemplo, si uno intenta seleccionar ciertos registros de una tabla o eliminar una tabla, el servidor se asegura de que uno tenga el privilegio SELECT para la tabla, o el privilegio DROP para la base de datos.

A continuación se muestran los privilegios manejados:

Privilegio Contexto
ALTER Tablas
DELETE Tablas
INDEX Tablas
INSERT Tablas
SELECT Tablas
UPDATE Tablas
DROP Bases de datos o tablas
GRANT Bases de datos o tablas
REFERENCES Bases de datos o tablas
CREATE Bases de datos, tablas o índices
FILE Acceso a archivo en el servidor
CREATE TEMPORARY TABLES Administración del servidor
EXECUTE Administración del servidor
LOCK TABLES Administración del servidor
PROCESS Administración del servidor
RELOAD Administración del servidor
REPLICATION CLIENT Administración del servidor
REPLICATION SLAVE Administración del servidor
SHOW DATABASES Administración del servidor
SHUTDOWN Administración del servidor
SUPER Administración del servidor

• Tabla: Privilegios en MySQL

La instalación de MySQL incluye dos bases de datos: mysql y test, siendo mysql la base de datos de sistema (de control) de MySQL. Por ello es importante cuidar los permisos que tenga un usuario a esta base de datos.

Nota:  Los privilegios o permisos por omisión en Windows le da a todos los usuarios locales (''@'localhost'), privilegios completos a todas las bases de datos, sin necesidad de especificar una contraseña.

Para hacer más segura la instalación de MySql, debemos eliminar de la tabla mysql.user el registro que contiene Host='localhost' y User='', agregar una contraseña para el usuario root, y crear un usuario de trabajo con contraseña:

  1. Arrancamos el servidor:
    dir_mysql/bin> mysqld --standalone
    
  2. Iniciamos el monitor utilizando la base de datos mysql:
    dir_mysql/bin> mysql mysql
    
  3. Eliminamos al usuario anónimo que tiene todos los privilegios:
    mysql> DELETE FROM user WHERE Host='localhost' AND User='';
    
  4. Salimos del monitor y hacemos que el servidor recargue la tabla de permisos:
    mysql> QUIT
    
    dir_mysql/bin> mysqladmin reload
    
  5. Cambiamos el password del usuario root a zeus:
    dir_mysql/bin> mysqladmin -u root password zeus
    
  6. Iniciamos nuevamente el monitor (como usuario root):
    dir_mysql/bin> mysql -u root -pzeus mysql
    
  7. Creamos una base de datos (db_curso):
    mysql> CREATE DATABASE db_curso;
    
  8. Creamos al usuario hera con contraseña diosa para trabajar con la base de datos recién creada (db_curso):
    mysql> GRANT ALL
        -> ON             db_curso.*
        -> TO             hera@'localhost'
        -> IDENTIFIED BY  'diosa';
    
  9. Recargamos la tabla de privilegios:
    mysql> FLUSH PRIVILEGES;
    
  10. Salimos del monitor:
    mysql> QUIT;
    
  11. Probamos que el usuario "hera" pueda conectarse:
    dir_mysql/bin> mysql -u hera -pdiosa db_curso
    
  12. Salimos del monitor y apagamos el servidor:
    mysql> QUIT;
    dir_mysql/bin> mysqladmin -u root -pzeus shutdown
    

Nota:  El tema de seguridad en MySQL es bastante extenso, así, si se va a utilizar MySQL como servidor de base de datos en una empresa, resulta muy importante estudiarlo y entenderlo completamente. Por ejemplo, un detalle en cuanto al comando DROP: no es posible especificar que un usuario tiene privilegios para crear o eliminar tablas, pero no para crear o suprimir la base de datos en sí misma.

2. Accediendo a MySql con Java

Antes de intentar acceder la base de datos con páginas JSP, vamos a hacerlo con un programa independiente (standalone):

import java.sql.*;
import java.net.*;
import java.util.*;

public class p141_MySql
{
  public static void main( String[] args )
  {
    try
    {
      Class.forName( "com.mysql.jdbc.Driver" );

      Connection con = DriverManager.getConnection(
        "jdbc:mysql://localhost:3306/db_curso", "hera", "diosa" );

      Statement stmt = con.createStatement();

      try
      {
        stmt.executeUpdate( "Drop Table agenda" );
      }
      catch( SQLException e )
      {
        ;
      }

      stmt.executeUpdate( "Create Table agenda " +
        "( Nom varchar( 15 ), Ape_pat varchar( 20 ) )" );

      stmt.executeUpdate( "Insert Into agenda " +
        "( Nom, Ape_pat ) Values( 'Laura', 'M.' )" );

      stmt.executeUpdate( "Insert Into agenda " +
        "( Nom, Ape_pat ) Values( 'Ana', 'D.' )" );

      stmt.executeUpdate( "Insert Into agenda " +
        "( Nom, Ape_pat ) Values( 'Janet', 'A.' )" );

      System.out.println( "Select Nom, Ape_pat From agenda;\n" );

      ResultSet rs = stmt.executeQuery(
        "Select Nom, Ape_pat From agenda;" );

      while( rs.next() )
      {
        System.out.println( " Nombre: " +
          rs.getString( 1 ) + " " + rs.getString( 2 ) );
      }

      System.out.println( "\nSelect Nom, Ape_pat From agenda " +
        "Where Nom='Laura';\n" );

      rs = stmt.executeQuery(
        "Select Nom, Ape_pat From agenda Where Nom='Laura';" );

      while( rs.next() )
      {
        System.out.println( " Nombre: " +
          rs.getString( 1 ) + " " + rs.getString( 2 ) );
      }
      rs.close();
    }
    catch( Exception e )
    {
      System.out.println( e.toString() );
    }
  }
}

• Archivo: p141_MySql.java

Puesto que este programa no forma parte de la aplicación Web, lo salvamos en dir_code.

Lo compilamos (javac), arrancamos el servidor MySQL (mysqld --standalone) y lo ejecutamos. Debemos obtener un resultado como el siguiente:

Select Nom, Ape_pat From agenda;

 Nombre: Laura M.
 Nombre: Ana D.
 Nombre: Janet A.

Select Nom, Ape_pat From agenda Where Nom='Laura';

 Nombre: Laura M.

3. Accediendo a MySql con JSP

Ahora accederemos a la base de datos con una página JSP:

<%@ page import="java.sql.*" %>
<%
  Connection con = null;
  Statement stmt = null;
  ResultSet rs   = null;
%>

<html>

<head>
<title>
Acceso a MySql
</title>
</head>

<body bgcolor="#ffeada">

<%
  Class.forName( "com.mysql.jdbc.Driver" ).newInstance();

  con = DriverManager.getConnection(
    "jdbc:mysql://localhost:3306/db_curso", "hera", "diosa" );
  stmt = con.createStatement();

  rs = stmt.executeQuery( "Select * From agenda;" );

  while( rs.next() )
  {
    out.println( " Nombre: " +
      rs.getString( 1 ) + " " + rs.getString( 2 ) + "<br>" );
  }
  rs.close();
%>

</body>
</html>

• Archivo: p151_MySql.jsp

Salvamos la página en dir_code/web, ejecutamos el Ant y la accesamos con el URL: http://localhost/curso/p151_MySql.jsp.