• Publicidad

Mojolicious Authentication

Todo lo relacionado con el desarrollo Web con Perl: desde CGI hasta Mojolicious

Mojolicious Authentication

Notapor memrobles » 2017-11-30 00:19 @055

Hola, Perleros, buenas noches. Espero se encuentren bien.

Me podrían ayudar, por favor.

Tengo una página web en Mojolicious y le quiero poner autenticación.

Ya leí Mojolicious::Plugin::Authentication pero la verdad entiendo poco o casi nada. Entonces busqué un ejemplo en Google y encontré este muy básico pero no encuentro dónde ponerle el usuario que va a tener acceso

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use Mojolicious::Plugin::Authentication;
  3. use Mojolicious::Lite;
  4.  
  5.  
  6.  
  7.  
  8. plugin 'authentication', {
  9.     autoload_user=>1,
  10.     load_user => sub {
  11.         my $self = shift;
  12.         my $uid  = shift;
  13.         return $uid;
  14.     },
  15.     validate_user => sub {
  16.         my $self = shift;
  17.         my $un = shift || '';
  18.         my $pw = shift || '';
  19.         my $extra = shift || {};
  20.         use Authen::Simple::DBI;
  21.        
  22.        
  23.         return $un;
  24.          
  25.         return undef;
  26.     },
  27. };
  28.  
  29.  
  30. get '/home' => sub {
  31.   my $self = shift;
  32.  
  33. };
  34.  
  35. get '/welcome' => sub {
  36.   my $self = shift;
  37.  
  38.   $self ->render('index');
  39.  
  40. };
  41.  
  42. post '/login' => sub {
  43.    
  44.   my $self = shift;
  45.   if ($self->authenticate($self->req->param('id')
  46.                   ,$self->req->param('pw')
  47.                   ,{brain_slug=>$self->req->param('')})) {
  48.     $self->render('home');
  49.   }
  50.   else {
  51.     $self->render('index');
  52.   }
  53. };
  54.  
  55. app->start;
  56. __DATA__
  57. @@ layouts/default.html.ep
  58. <!DOCTYPE html>
  59. <html>
  60.   <head>1<title><%= title %></title></head>
  61.   <body><%= content %></body>
  62. </html>
  63.  
  64. @@ index.html.ep
  65. % layout 'default';
  66. % title 'Welcome';
  67. Welcome to Authorization
  68. <form action="/login" method="post">
  69. <table>
  70. <tr> <td> User </td> <td> <input type="text" name="id" /> </td> </tr>
  71. <tr> <td> Password </td> <td> <input type="password" name="pw" /> <input type="hidden" name="slug" value="yes"></td> </tr>
  72. </table>
  73. <input type="submit" name="mysubmit" value="Click!" />
  74. </form>
  75.  
  76. @@ home.html.ep
  77. % layout 'default';
  78. % title 'home';
  79. lets all go to the brain slug planet! home
  80.  
  81. @@ layouts/default.html.ep
  82. <!DOCTYPE html>
  83. <html>
  84.   <head><title><%= title %></title></head>
  85.   <body><%= content %></body>
  86. </html>
Coloreado en 0.006 segundos, usando GeSHi 1.0.8.4


Sí se ejecuta pero al poner cualquier usuario y contraseña en login, entra a home.

Gracias de antemano por su ayuda.
memrobles
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2015-12-07 15:05 @670

Publicidad

Re: Mojolicious Authentication

Notapor memrobles » 2017-11-30 01:08 @089

Hola, Perleros.

Encontré un videotutorial http://mojocasts.com/e3#Under%20directive y lo hace muy bien solo que sin el "Mojolicious::Plugin::Authentication". No sé si será seguro. ¿Y cómo hacer para proteger los routers o páginas extras?

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!/usr/bin/env perl
  2. use Mojolicious::Lite;
  3.  
  4.  
  5. helper auth => sub {
  6.         my $self = shift;
  7.  
  8.         return 1 if
  9.         $self->param('username') eq 'bender' and
  10.         $self->param('password') eq 'rodriguez';
  11. };
  12.  
  13. get '/login'=> sub { shift->render('login') };
  14.  
  15. under sub {
  16.         my $self = shift;
  17.         return 1 if $self->auth;
  18.  
  19.         $self->render(text => 'denied');
  20.         return;
  21. };
  22.  
  23. post 'momcorp' => sub { shift->render(text => 'welcome to Momcorp!') };
  24.  
  25. post '/momcorp/carol' => sub { shift->render(text => 'welcome, Carol') };
  26.  
  27. app->start
  28.  
  29. __DATA__
  30.  
  31. @@ login.html.ep
  32. %= t h1 => 'login'
  33. %= form_for 'momcorp' => (method => 'post') => begin
  34. username: <%= text_field 'username' %>
  35. password: <%= text_field 'password' %>
  36. %= submit_button 'log in'
  37. %= end
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4


Slds
memrobles
Perlero nuevo
Perlero nuevo
 
Mensajes: 27
Registrado: 2015-12-07 15:05 @670

Re: Mojolicious Authentication

Notapor explorer » 2017-11-30 18:58 @832

Empezando por lo básico...

Una forma de aprender es a partir de Mojolicious::Guides. Si tienes prisa por ver ejemplos de lo que necesitas, casi seguro que en Mojolicious::Guides::Cookbook también encuentras algo. O seguir el Mojolicious::Guides::Tutorial.

Del ejemplo que pones en el segundo mensaje, vemos cómo hacer para "proteger" un determinado árbol de rutas de nuestro sitio web.

En las líneas 5 a 11 se declara un helper llamado auth(), que es el que devuelve un valor verdadero si verifica al usuario que se registró en el sistema.

En la línea 13 tenemos la llamada normal al formulario de registro.

En la línea 15, la directiva 'under' indica que todas las rutas que siguen deben ejecutarse bajo la ejecución previa de la subrutina que define a continuación, hasta la línea 21. Lo que hacen esas líneas es llamar al auth() anterior para validar al usuario, o sacar el mensaje de acceso denegado, directamente, al usuario.

Las rutas de las líneas 23 y 25 solo son accesibles si el usuario en el login es correcto. Es decir: si nosotros queremos hacerle un POST a la ruta /momcorp/carol, antes de ejecutar la línea de código de la línea 25, Mojolicious ejecuta la subrutina de 'under' de la línea 15, que a su vez llama a auth() de la línea 5. Si antes nosotros no nos hemos registrado en el sistema, nos sacará el mensaje de acceso denegado. Si no, el mensaje de bienvenida.

En el Tutorial se muestra que under se usa también para prefijar grupos de rutas. En Mojolicious::Guides::Routing hay otros ejemplos de uso de 'under'.

En cuanto al complemento Mojolicious::Plugin::Authentication, sirve para simplificar un poco más todo lo anterior.

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. use Mojolicious::Plugin::Authentication;
  2.  
  3. $self->plugin('authentication' => {
  4.     autoload_user   => 1,
  5.     session_key     => 'wickedapp',
  6.     load_user       => sub { ... },
  7.     validate_user   => sub { ... },
  8.     current_user_fn => 'user', # compatibility with old code
  9. });
  10.  
  11. my $authenticated = $self->authenticate(
  12.     'username', 'password',
  13.     { optional => 'extra data stuff' },
  14. );
  15.  
  16. if ($authenticated) {
  17.     ...
  18. }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

Hay algún ejemplo en la carpeta de tests: https://metacpan.org/source/JJATRIA/Moj ... ion-1.32/t

El resumen es: dentro de plugin 'authentication' se definen varios comportamientos. El principal es el 'validate_user', que recibe los argumentos ($app, $username, $password, $extradata) y debe devolver el código de usuario ($uid) o un valor indefinido.

Con esos valores debes determinar si el usuario se valida o no en el sistema. En tu caso, no haces nada, simplemente devuelves el propio nombre del usuario (return $un), sin realizar ninguna comprobación, por lo que cualquier usuario puede entrar.

Una vez que el usuario se ha verificado, se llama a la subrutina declarada por 'load_user', que recibe los argumentos ($app, $uid). El $uid es el valor devuelto antes. Y el resultado debe ser un objeto o estructura con los datos asociados a ese usuario que sirvan para el resto de la aplicación. Si en tu aplicación no tienes nada de esto, pones el valor de 'autoload_user' a 0.

En el manual se comenta cómo poner los tiempos de expiración de esta sesión con este usuario.

Una vez creado todo esto, se pueden usar los métodos siguientes:
  • authenticate, para autenticar a un usuario, como tienes en la línea 45. Si devuelve un valor verdadero, el usuario es válido
  • is_user_authenticated, que devuelve verdadero o falso si una llamada a load_user devuelve un objeto válido.

En tu código de ejemplo, vemos que cargas el módulo Authen::Simple::DBI, seguramente para validar el usuario contra una base de datos, pero no hay nada de ese código.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14482
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Web

¿Quién está conectado?

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