pereinar 2002/10/07 22:35:33 Modified: src/docs/1.0/guide modules.pod Log: Added Login page contribution from Alan Bailward, <[EMAIL PROTECTED]>. (I'm not too happy with where I placed it, but there wasn't anywhere else... it was too 1.0 centric for correct_headers) Revision Changes Path 1.9 +118 -0 modperl-docs/src/docs/1.0/guide/modules.pod Index: modules.pod =================================================================== RCS file: /home/cvs/modperl-docs/src/docs/1.0/guide/modules.pod,v retrieving revision 1.8 retrieving revision 1.9 diff -u -r1.8 -r1.9 --- modules.pod 16 Jun 2002 12:04:17 -0000 1.8 +++ modules.pod 8 Oct 2002 05:35:33 -0000 1.9 @@ -243,6 +243,120 @@ (L<Apache::Request|download::third_party/Apache__Request>) +=head1 Apache::Cookie example: Login Pages by Setting Cookies and Refreshing + +On occassion you will need to set a cookie and then redirect the user +to another page. This is probably most common when you want a +Location to be password protected, and if the user is unauthenticated, +display to them a login page, otherwise display another page, but both +at the same URL. + +=head2 Logic + +The logic goes something like this: + +=over 4 + +=item * + +Check for login cookie + +=item * + +If found, display the page + +=item * + +If not found, display a login page + +=item * + +Get username/password from a POST + +=item * + +Authenticate username/password + +=item * + +If the authentication failed, re-display the login page + +=item * + +If the authentication passed, set a cookie and redirect to the same +page, and display + +=back + +=head2 Example Situation + +Let's say that we are writing a handler for the location I</dealers> +which is a protected area to be accessed only by people who can pass a +username / password authentication check. + +We will use C<Apache::Cookie> here as it runs pretty fast under +mod_perl, but C<CGI::Cookie> has pretty much the same syntax, so you +can use that if you prefer. + +For the purposes of this example, we'll assume that we already have +any passed parameters in a I<%params> hash, the C<authenticate()> +routine returns B<true> or B<false>, I<display_login()> shows the +username and password prompt, and I<display_main_page()> displays the +protected content. + +=head3 Code + + if( $params{user} and $params{pass} ) { + if(!authenticate(%params)) { + +Authentication failed, send them back to the login page. B<NOTE:> +It's a good idea to use C<no_cache()> to make sure that the client +browser doesn't cache the login page. + + $r->content_type('text/html'); + $r->no_cache(1); + $r->send_http_header; + display_login(); + } else { + +The user is authenticated, create the cookie with C<Apache::Cookie> + + my $c = Apache::Cookie->new( $r, + -name => 'secret', + -value => 'foo' + -expires => '+3d', + -path => '/dealers' + ); + +B<NOTE:> when setting the 'expires' tag you must set +it with I<either> a leading B<+> or B<->, as if either +of these is missing, it will be put literally into the +cookie header. + +Now send them on their way via the authenticated page + + $r->content_type('text/html'); + $c->bake; + $r->header_out("Refresh"=>"0;url=/dealers"); + $r->no_cache(1); + $r->send_http_header; + $r->print( "Authenticated... heading to main page! ); + +The above code will set the headers to refresh (this is the same +syntax as for the HTML meta tag) after 0 seconds. The page that is +flashed on the screen will have the text in the C<$r-E<gt>print> + + } + } + elsif( $cookies{secret} ) { + +If they already have a secret cookie, display the main (protected) page. Don't +forget to check the validity of cookie data! + + display_main_page(); + } + + =head1 Apache::RequestNotes - Allow Easy, Consistent Access to Cookie and Form Data Across Each Request Phase C<Apache::RequestNotes> provides a simple interface allowing all @@ -773,6 +887,10 @@ =item * Stas Bekman E<lt>stas (at) stason.orgE<gt> + +=item * + +Alan Bailward, E<lt>alan (at) ufies.orgE<gt> =back
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]