martes, 8 de julio de 2014

[Windows] Convertir tu computadora en un router inalambrico



Muchas veces tenemos una conexión ya sea cableada o por medio de una banda ancha de 3g y necesitamos compartir internet por ejemplo a los dispositivos móviles por ejemplo en un celular que no tiene datos por lo tanto podemos hacer que nuestra computadora comparta el internet.


Primero ya que tenemos nuestra computadora ya con internet abriremos una terminal con privilegios de administrador. Escribiremos lo siguiente:






netsh wlan set hostednetwork mode=allow ssid=redquecompartira key=1234567890


Ya una vez creada ya vamos a iniciar nuestra red

netsh wlan start hostednetwork







Ya lo único que hacemos es compartir la conexión, para esto nos vamos a nuestro adaptador en recursos de red, damos clic derecho en la conexión con internet y damos en la pestaña compartir en este caso la red que cree es equivalente a la conexión de área local por lo que la marco y damos aceptar







Ya por ultimo si tienen algun firewall que no permita la conexion deshabilitelo o configurelo para que permita.

Listo ya tenemos una conexion de red inalambrica que pueda a utilizarse con cualquier dispositivo

jueves, 19 de junio de 2014

[JAVA EE] Autentificación de usuarios usando JAAS en aplicación web

Java Authentication and Authorization Service es una plataforma que permite a las aplicaciones de java crear ambientes seguros para las aplicaciones, los cuales puedes restringir que tipo de peticiones acepta en base a los encabezados HTTP y que usuarios tienen permisos.  

Lo que vamos a hacer es una pequeña aplicación implementada en Glassfish 4.0 y utilizando Netbeans en la cual en una aplicación web tendremos cuatro archivos jsp, uno de bienvenido a la aplicación (index.jsp), uno de login (login.jsp) que nos ayudara a pedir las credenciales de los usuarios, una de error (error.jsp) que se mostrara cuando el usuario no de las credenciales correctas y por ultimo tendremos una pagina inicial (index.jsp) puesta en una carpeta adicional (protegido) que permitira dar la bienvenida a los usuarios que fueron autentificados de manera correcta.

Empezamos creando una aplicación web para java utilizando Java EE 7 


Una vez creado tu proyecto procedemos a crear cada uno de los archivos  en este caso ya nos crea iun index, aunque no sea jsp porque depende la versión de netbeans puedemos dejarlo con el mismo codigo. En este caso el archivo index.jsp tendra el siguiente codigo

<!DOCTYPE html>

<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <div>Bienvenido a mi aplicación </div>
    </body>
</html>

Damos botón derecho y creamos el archivo error.jsp

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <h1>Error !</h1>
    </body>
</html>

 Damos clic derecho en web pages y ponemos Folder en este caso le pongo el nombre de protegido






Damos clic derecho en dicho folder creado y damos clic derecho new -> Jsp y creamos el index.jsp que nos indicara que ya estamos en un ambiente protegido

<!DOCTYPE html>

<html>
    <head>
        <title>TODO supply a title</title>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
    </head>
    <body>
        <div>Bienvenido a entorno protegido </div>
    </body>
</html>

Por ultimo creamos en la carpeta de Web Pages el login.jsp que nos permitira hacer la autentificacion con el nombre del usuario y contraseña. El cuadro de texto del nombre debe llamarse j_username, el cuatro de texto debe de llamarse j_password por ultimo solo la acción del submit del formulario debe de llamar a j_security_check

Codigo de login.jsp

Listo!, Ahora solo tenemos que configurar nuestro sitio para esto damos clic derecho en el proyecto y agregamos el deployment descriptor que es quien manejara los parametros de los datos protegidos.

Primero le marcamos en el web.xml como se hara la autentificación

Luego posteriormente damos las restricciones para la carpeta que ese estara utilizando como protegida en el web.xml





Y por ultimo damos de alta los roles que son necesarios

Aquí muestro el web.xml completo



<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
          version="3.1">
    <!-- Configuracion de mi login -->  
    <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>      
       <!-- Configurar los roles de seguridad -->
       <security-role>
           <role-name>admin</role-name>
       </security-role>
       <!-- Vienen las restricciones de mi sitio -->
       <security-constraint>
           <display-name>Contexto Seguro</display-name>
           <web-resource-collection>
               <web-resource-name>admin</web-resource-name>
               <url-pattern>/protegido/*</url-pattern>            
           </web-resource-collection>
           <auth-constraint>
               <role-name>admin</role-name>
           </auth-constraint>
       </security-constraint>
       <!-- ............................. -->
    <session-config>                                
        <session-timeout>
            30
        </session-timeout>
    </session-config>
</web-app>


Ahora solo mapearemos los roles con los grupos de los usuarios ya que en el repositorio de datos estaremos trabajando con grupos, para eso ocupamos un xml que permita ese puente con el servidor en el caso de glassfish utilizamos glassfish-web.xml su codigo:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd">
<glassfish-web-app error-url="">
  <context-root>/jaas</context-root>
  <class-loader delegate="true"/>
  <jsp-config>
    <property name="keepgenerated" value="true">
      <description>Keep a copy of the generated servlet class' java code.</description>
    </property>
  </jsp-config>
  <security-role-mapping>
    <role-name>admin</role-name>
    <group-name>Users</group-name>        
</security-role-mapping>
</glassfish-web-app>

Por ultimo solo configuraremos un usuario, para esto ponemos en nuestro navegador la dirección
localhost:4848

Esto abrira el panel de configuración de Glassfish , para eso nos vamos a ir a la opcion de configuración -> Server config -> Seguridad -> Dominios -> file, es la autentificacion que tiene por default el servidor por lo que agregaremos un usuario.


Ahi agregamos un usuari, no ilvidemos que debe de ser el grupo Users porque es como lo mapeamos en el XML del glassfish

Con esto cada que vayamos a entrar a localhos:8080/mi proyecto/protegido automaticamente el servidor tratara de verificar que tienen una sesión activa si no la tiene lo mandara a login, el cual le pedira los datos de usuario y contraseña que son los que dio de alta, si los da erroneos lo mandara directamente a error.jsp, si los da correcto les permitira entrar. 


jueves, 5 de junio de 2014

Configurar Variables de entorno para Java en windows

Configurar Variables de entorno


  • En Windows, abra el cuadro de diálogo Environment Variables, entrando a propiedades del sistema -> Configuracion avanzada 

 



  • Configure la variable de entorno JAVA_HOME en el directorio donde instaló el JDK, por ejemplo: C:\Program Files\Java\jdk1.7.0_60. En Windows de 64 bits, la ruta predeterminada es C:\Program Files(x86)\Java\jdk1.7.0_60. Puede checarlo en sus propios archivos de los equipos
  
  • En la variable de entorno PATH, agregue %JAVA_HOME%\bin; ó  C:\Program Files\Java\jdk1.7.0_60\bin al principio de la cadena, no olvide el ";".  Haga clic en aceptar para guardar y cerrar el cuadro de diálogo Environment Variables.





  • Compruebe que las variables de entorno estén configuradas correctamente. Escriba java -version y asegúrese de que la versión de Java sea la misma que la versión que ha configurado en la variable de entorno: 
  • Abra una ventana del símbolo del sistema.
java version "1.7.0_60"
Java(TM) SE Runtime Environment (build 1.7.0_60-b07)
Java HotSpot(TM) Client VM (build 19.1-b02, mixed mode, sharing)

Nota: Puede añadir una mas si es que no la tiene con el nombre de ClassPath y valor un punto


domingo, 20 de abril de 2014

[c# y Mysql] Mandar un arreglo de numeros a un procedimiento almacenado


Hoy tengo un problema que no habia podido resolver, aunque la verdad me cuesta mucho trabajo manejar un objeto persistente a la base de datos las transacciones en red regularmente son un poco lentos en C#(cosa que no me ocurre con JAVA). Por lo que el problema que tengo hoy es meter una serie de folios a la base de datos pero no quiero mandar una sentencia por cada folio porque como mi servidor esta en un maquina diferente dentro de una red, mandare el conjunto de folios dentro de un arreglo y lo procesare a traves de un procedimiento almacenado por lo que les comento el ejemplo completo. Primero creare una clase que me permitira generar una secuencia de folios para no tener problema, creare un windows form y hare un formulario como el siguiente:



 Primero validaremos que los dos primeros solo acepten digitos por lo que los amarramos a un mismo evento de tipo keypress. En este caso se llama isDigit aunque no regresara algo pues nos servira para evitar que se de eco en el cuadro de texto. 

private void isDigit(object sender, KeyPressEventArgs e)
        {
            if (!Char.IsDigit(e.KeyChar))
                e.KeyChar = '\0';
        }

Para el comision como solo necesito que valide que acepte numerico solo le puse una mascara de tipo currency. 

Ahora lo que necesitaremos en programar el boton de la palomita en este caso vamos a formatear la entrada que necesitamos y posteriormente se instanciara una clase que tendra la llama al procedimiento almacenado, el codigo es el siguiente: 

 private void agregaFolios(object sender, EventArgs e)
        {
            //convertimos lo que tiene el cuadro de texto a enteros
            int inicial = Convert.ToInt32(txtinicial.Text);
            int final = Convert.ToInt32(txtfinal.Text);
            //verificamos que folios tengan una secuencia 
            if( inicial <= final)
            {
                //cadena que tendra todos los numeros separados con ,
                string folios=""; 
                //ciclo que permite recorrer los valores y ponerlos en una cadena 
                for (int i = inicial; i <= final; i++)
                {
                    folios += i;
                    folios += ","; // no se preocupen porque termine con comas el procedimiento lo resolvera
                }
                //las validaciones basicas se cumplieron 
                // ahora haremos el procedimiento del registro por lo que pondre que el formulario me regrese OK para validacion posterior
                this.DialogResult = DialogResult.OK; 
                // Ahora instanciamos la clase que necesito 
                OpeAgentes soliciudes = new OpeAgentes();
                // mandamos los datos en este caso solo necesitan folios y los datos que quieran mandar.
                soliciudes.Addsolicitudes(folios, idagente, frmPanel.userActive.Iduser,Convert.ToDouble(textEdit1.Text));
                //cerramos el formulario
                this.Dispose(); 
                this.Close(); 
            }
            else
                MessageBox.Show("El folio inicial debe de ser menor que el final");
        }
Ahora abrimos la clase OpeAgentes y haremos el metodo Addsolicitudes para habilitar el insert. 

 public void Addsolicitudes(string folios, int idagente, int user, double comision)
        {
            MySqlConnection SQLConexion = default(MySqlConnection);            
            try
            {
                //creamos la conexion con la cadena
                SQLConexion = new MySqlConnection(SQLmConnStr);
                SQLConexion.Open(); //abrimos la conexion
                //mandamos llamar el procedimiento
                MySqlCommand SQLComando = new MySqlCommand("addfoliossolicitudes", SQLConexion);
                SQLComando.CommandType = CommandType.StoredProcedure;
                //agregamos los parametros que necesitara el procedimiento
                SQLComando.Parameters.AddWithValue("arrayFolio", folios);
                SQLComando.Parameters.AddWithValue("pagente", idagente);
                SQLComando.Parameters.AddWithValue("pcomision", comision);                
                SQLComando.Parameters.AddWithValue("piduser", user);

                //--- Ejecutar SQL
                SQLComando.ExecuteNonQuery();
                SQLComando.Dispose();
                SQLConexion.Close();
                SQLConexion.Dispose();
            }
            catch (MySqlException ex)
            {
                Console.Write(ex);

                if (SQLConexion.State == ConnectionState.Open)
                {
                    SQLConexion.Close();
                    SQLConexion.Dispose();
                }
            }
            finally
            {
                if (SQLConexion.State == ConnectionState.Open)
                {
                    SQLConexion.Close();
                    SQLConexion.Dispose();
                }

            }
        }

Ya por ultimo realizamos nuestro procedimiento almacenado para esto utilizaremos los siguiente

CREATE DEFINER=`root`@`localhost` PROCEDURE `addfoliossolicitudes`(arrayFolio text, pagente int, pcomision double, piduser int)
BEGIN
WHILE (LOCATE(',', arrayFolio) > 0)
DO
SET @value = ELT(1, arrayFolio);
    SET @FOLIO = SUBSTRING(arrayFolio, 1, LOCATE(',',arrayFolio)-1);
    SET arrayFolio = SUBSTRING(arrayFolio, LOCATE(',', arrayFolio) + 1);
    -- Se le pone IGNORE para si ya hay un folio solo ignore el error y siga con los demas folios
    -- INSERT QUE SE REPITE por cada folio que tenga
    INSERT IGNORE INTO `solicitudes`(x,y,z,w,u,v,j) 
                        VALUES(@FOLIO,pagente,pcomision,0,piduser,now(),'Algo');
END WHILE;
END

Y listo en este caso di de alta del 100 al 150 y el resultado es: 


Espero les pueda servir