• Publicidad

Ejecutar un programa antes que otro

¿Apenas comienzas con Perl? En este foro podrás encontrar y hacer preguntas básicas de Perl con respuestas aptas a tu nivel.

Re: Ejecutar un programa antes que otro

Notapor explorer » 2011-02-25 14:47 @657

Esto se está complicando mucho. ¿No podrías publicar un ejemplo mínimo de todos los ficheros implicados?

Por lo que he entendido, quieres redirigir la petición a una página de entrada si el usuario no está registrado. Entonces, eso se hace en el CGI que ejecuta el usuario cuando entra en el web. El CGI se da cuenta de que el usuario no está autenticado, por lo que en lugar de presentar una página normal, hace un redirect() a la página que muestra el registro de entrada.

El navegador del usuario recibe el redirect() y lo ejecuta: carga otro URL, el del registro. El usuario se identifica, pulsa el botón y la petición la recibe el mismo CGI u otro, que almacena la sesión de ese usuario. Y le pasa el control al CGI principal, o manda por sí mismo un saludo al usuario, consistente en un HTML con un pequeño mensaje, pero con una cabecera Refresh, que le llevará al URL principal al cabo de unos segundos.

El CGI principal se ejecuta y muestra el contenido después de ver que el usuario sí que está autenticado.

Pero esto es una forma de hacerlo. Hay más...

Por otra parte... todo lo que sea ejecutar subrutinas entre códigos Perl, es algo completamente normal (de forma directa, heredada en forma de métodos, system(), qx(), do(), etc.), pero hay que recordar que toda esa ejecución forma parte de UNA sola petición del usuario. El usuario está esperando una respuesta.

Eso quiere decir que tu no puedes llamar a una subrutina de login(), esperar a que el usuario se identifique, y luego seguir con el programa principal. No puedes hacerlo porque ahí contamos al menos dos peticiones HTTP por parte del usuario.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Publicidad

Re: Ejecutar un programa antes que otro

Notapor noa86 » 2011-02-25 17:35 @774

Es que son muchos archivos los implicados...

Pero vaya. tengo una aplicación que trata todo el tema de identificación antes de ejecutar la pagina main.html que es la principal, y el programa principal es Main.cgi, que utiliza diversos packages.

Lo que tengo que hacer ahora es, integrar en esa autenticación una aplicación, una página web que ya está creada, con archivos .perl. Y el problema es que no sé cómo hacerlo.

No sé si tengo que usar los packages de aplicación de identificación o cómo tengo que hacer para controlar que al entrar en la aplicación Perl si no está identificado el usuario se identifique con la otra aplicación y sino que pueda ejecutar la aplicación Perl.

La aplicación de autenticación que he cogido de muestra está aquí: http://perlmvccgiapp.sourceforge.net/

Por lo que estoy viendo es complicado. Y la verdad que es un proyecto que tengo que realizar... y tengo que conseguir hacerlo...
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Ejecutar un programa antes que otro

Notapor explorer » 2011-02-25 18:03 @793

Estás usando el entorno de trabajo web CGI::Application.

Es un entorno extenso, con algunas partes complicadas, pero, cuando se entienden, se generan aplicaciones web muy rápidamente (el último que he hecho es así, con CGI::Application y varios de sus complementos)

Eso sí, hay que leer mucho. Por ejemplo, en la sección de ejemplos hay uno de login/logout.

Fíjate mucho en los ejemplos que aparecen. También en CPAN hay mucha documentación, pero ya refería a cada módulo.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejecutar un programa antes que otro

Notapor noa86 » 2011-02-25 18:18 @804

Si esos manuales, ejemplos, etc, ya me los he mirado. Y el código de la aplicación con CGI::Application entiendo lo que hace, me lo he mirado muchas veces. Pero el problema que tengo es que no sé cómo integrar la otra aplicación. Cómo poder mirar desde la otra aplicación Perl si alguien se ha registrado o no. Además esta aplicación Perl no usa templates, entonces no sé cómo realizar las llamadas porque ya no me sirve el load_template...

Es complicado, la verdad. Sobre todo explicarme lo que quiero intentar decir...

Gracias, de todos modos, una vez más...
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Ejecutar un programa antes que otro

Notapor explorer » 2011-02-25 18:24 @808

Vamos a ver... Esa aplicación que dice si el usuario está registrado o no, debe esperar unos argumentos y entregar unas salidas... ¿no?

Pues entonces, dentro de la aplicación CGI, se hace un llamado a la otra aplicación, pasándole los argumentos que espera, y recibimos la salida. Y en función de la salida, sacamos una página u otra.

¿No es eso?

Pues con system(), qx(), open()... se puede llamar a la otra aplicación, desde nuestra aplicación CGI.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejecutar un programa antes que otro

Notapor noa86 » 2011-02-25 18:33 @814

¿Y cómo hago para que no se pueda acceder directamente a la aplicación Perl sin estar identificado? Ese es mi principal problema... que si se hace llamada http://localhost/cgi-bin/programa.perl no tiene que dejar ejecutarse sin estar identificado. Tiene que ser enviado a main.cgi. Por eso había pensado lo de redireccionar. Pero si meto una linea de redirección luego no puedo ejecutar esta llamada. O puedo mirar en el lugar donde está registrado el usuario si hay alguno registrado o no para que se redireccione en el caso de que no y se ejecute la aplicación Perl en el caso de que sí.
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Ejecutar un programa antes que otro

Notapor explorer » 2011-02-25 18:41 @820

Puedes hacer varias cosas:

* modificar la aplicación Perl, para que al principio compruebe si el usuario está identificado. Si no lo está, lo redireccionas a la pantalla de entrada. El formulario de entrada debe ejecutar otro CGI que indique al sistema que el usuario se ha autenticado.

* hacer que el usuario no ejecute la aplicación, sino que ejecute siempre un CGI que compruebe su autenticidad, y si es correcta, ejecuta desde él mismo la aplicación.

Dices que si metes una línea de redirección no puedes volver a ejecutar la aplicación. Vuelve a leer con calma el primer párrafo de este mensaje: hay que poner una condición al principio para que compruebe la autenticidad del usuario.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejecutar un programa antes que otro

Notapor noa86 » 2011-02-25 18:53 @828

Vale, muchas gracias... veo muy complicado para mi que pueda hacerlo porque hay que saber varias cosas, y un nivel alto de Perl, y el mío es bastante básico. Hay muchas cosas que no sé hacer...

Lo intentaré eso sí. Aunque no sé cómo comprobar la autenticidad que me comentas...
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

Re: Ejecutar un programa antes que otro

Notapor explorer » 2011-02-25 19:12 @842

El usuario debe mandar, en algún momento, su nombre de usuario y contraseña, y la debes buscar en alguna base de datos, incluso en un fichero normal.

Y usando CGI::Session (o CGI::Application::Plugin::Session) puedes controlar si la siguiente petición que llega es de un usuario ya autenticado o no.

Hay un módulo también específico para ello: CGI::Application::Plugin::Authentication

Ejemplo muy detallado de un proceso de login con CGI::Application y algunos de sus complementos (en inglés).
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Ejecutar un programa antes que otro

Notapor noa86 » 2011-02-28 16:40 @736

He encontrado este ejemplo para utilizar CGI::Application en un programa Perl.
Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/perl
  2.  
  3. #
  4. # Sample application
  5. #
  6. # Just place this file in a CGI enabled part of your website, and
  7. # load it up in your browser.  The only valid username/password
  8. # combination is 'test' and '123'.
  9. #
  10.  
  11. use strict;
  12. use warnings;
  13.  
  14. {
  15.  
  16.     package SampleLogin;
  17.  
  18.     use base qw(CGI::Application);
  19.  
  20.     use CGI::Application::Plugin::Session;
  21.     use CGI::Application::Plugin::Authentication;
  22.     use CGI::Application::Plugin::AutoRunmode;
  23.     use CGI::Carp qw(fatalsToBrowser);
  24.  
  25.     my %config = (
  26.         DRIVER         => [ 'Generic', { test => '123' } ],
  27.         STORE          => 'Cookie',
  28.         LOGOUT_RUNMODE => 'one',
  29.     );
  30.     SampleLogin->authen->config(%config);
  31.     SampleLogin->authen->protected_runmodes('two');
  32.  
  33.     sub setup {
  34.         my $self = shift;
  35.         $self->start_mode('one');
  36.     }
  37.  
  38.     sub one : Runmode {
  39.         my $self = shift;
  40.  
  41.         return CGI::start_html( -style => { -code => $self->authen->login_styles } )
  42.           . CGI::h2('This page is NOT protected')
  43.           . CGI::a( { -href => '?rm=two' }, 'Protected Runmode' )
  44.           . CGI::end_html();
  45.     }
  46.  
  47.     sub two : Runmode {
  48.         my $self = shift;
  49.  
  50.         return CGI::start_html( -style => { -code => $self->authen->login_styles } )
  51.           . CGI::h2('This page is protected')
  52.           . CGI::h2( 'username: ' . $self->authen->username )
  53.           . CGI::a( { -href => '?rm=one' }, 'Un-Protected Runmode' )
  54.           . CGI::br()
  55.           . CGI::a( { -href => '?authen_logout=1' }, 'Logout' )
  56.           . CGI::end_html();
  57.     }
  58. }
  59.  
  60. SampleLogin->new->run;
Coloreado en 0.005 segundos, usando GeSHi 1.0.8.4

Mi duda es: ¿podría configurarse de manera que la autenticación sea con los usuarios de una base de datos, y no con test, 123 que es como está configurado en este ejemplo el driver? ¿Cómo se haría? Porque por lo que entiendo habría que poner la base de datos en cuestión en esta parte del código.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
my %config = (
        DRIVER         => [ 'Generic', { test => '123' } ],
        STORE          => 'Cookie',
        LOGOUT_RUNMODE => 'one',
    );
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Si se podría hacer, me facilitaría mucho las cosas este sencillo ejemplo, ya que el anterior era más complicado...
noa86
Perlero nuevo
Perlero nuevo
 
Mensajes: 93
Registrado: 2010-11-15 14:43 @655

AnteriorSiguiente

Volver a Básico

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 30 invitados