X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FCatalyst%2FManual%2FTutorial%2FAuthentication.pod;h=f58e2d6b986e80bdde8d12582a995e6cd0d336f9;hb=d645910ddfb37f5c18acaf6ce88fd392a91101db;hp=e1ac250c58e91eb4206551a013e7db2c1bbff4b6;hpb=4d583dd846a0ffa9bd224014f89df39db957c35f;p=catagits%2FCatalyst-Runtime.git diff --git a/lib/Catalyst/Manual/Tutorial/Authentication.pod b/lib/Catalyst/Manual/Tutorial/Authentication.pod index e1ac250..f58e2d6 100644 --- a/lib/Catalyst/Manual/Tutorial/Authentication.pod +++ b/lib/Catalyst/Manual/Tutorial/Authentication.pod @@ -1,14 +1,13 @@ =head1 NAME -Catalyst::Manual::Tutorial::Authentication - Catalyst Tutorial – Part 4: Authentication - +Catalyst::Manual::Tutorial::Authentication - Catalyst Tutorial - Part 4: Authentication =head1 OVERVIEW This is B for the Catalyst tutorial. -L +L =over 4 @@ -22,7 +21,7 @@ L =item 3 -L +L =item 4 @@ -46,33 +45,40 @@ L =item 9 -L +L =back - =head1 DESCRIPTION -Now that we finally have a simple yet functional application, we can focus on providing authentication (with authorization coming in Part 5). +Now that we finally have a simple yet functional application, we can +focus on providing authentication (with authorization coming next in +Part 5). -This part of the tutorial is divided into two main sections: 1) basic, cleartext authentication and 2) hash-based authentication. +This part of the tutorial is divided into two main sections: 1) basic, +cleartext authentication and 2) hash-based authentication. -B: Note that all of the code for this part of the tutorial can be pulled from the Catalyst Subversion repository in one step with the following command: +B: Note that all of the code for this part of the tutorial can be +pulled from the Catalyst Subversion repository in one step with the +following command: - svn checkout http://dev.catalyst.perl.org/repos/Catalyst/trunk/examples/Tutorial@### + svn checkout http://dev.catalyst.perl.org/repos/Catalyst/trunk/examples/Tutorial@4612 . IMPORTANT: Does not work yet. Will be completed for final version. - =head1 BASIC AUTHENTICATION -This section explores how add authentication logic to a Catalyst application. +This section explores how to add authentication logic to a Catalyst +application. =head2 Add Users and Roles to the Database -First, we add both user and role information to the database (we add the role information here although it will not be used until the authorization section, Part 5). Create a new SQL script file by opening C in your editor and insert: +First, we add both user and role information to the database (we will +add the role information here although it will not be used until the +authorization section, Part 5). Create a new SQL script file by opening +C in your editor and insert: -- -- Add users and roles tables, along with a many-to-many join table @@ -113,11 +119,14 @@ Then load this into the C database with the following command: $ sqlite3 myapp.db < myapp02.sql -=head2 Add User and Role Information to Dbic Schema +=head2 Add User and Role Information to DBIC Schema -This step adds DBIC-based classes for the user-related database tables (the role information will not be used until the Part 5): +This step adds DBIC-based classes for the user-related database tables +(the role information will not be used until Part 5): -Edit C and update the contents to match (only the C [qw/Book BookAuthor Author User UserRole Role/]> line has changed): +Edit C and update the contents to match (only the +C [qw/Book BookAuthor Author User UserRole Role/]> line +has changed): package MyAppDB; @@ -324,16 +333,14 @@ Again, notice that your "result source" classes have been "re-loaded" by Catalys =head2 Include Authentication and Session Plugins -Edit C and update it as follows (everything below C is new): +Edit C and update it as follows (everything below C is new): use Catalyst qw/ -Debug ConfigLoader Static::Simple - Dumper StackTrace - DefaultEnd Authentication Authentication::Store::DBIC @@ -344,14 +351,28 @@ Edit C and update it as follows (everything below C is Session::State::Cookie /; -The three C plugins work together to support Authentication while the C plugins are required to maintain state across multiple HTTP requests. Note that there are several options for L (although L is generally a good choice if you are on Unix; try L if you are on Win32) -- consult L and its subclasses for additional information. +The three C plugins work together to support +Authentication while the C plugins are required to maintain +state across multiple HTTP requests. Note that there are several +options for L +(L +is generally a good choice if you are on Unix; try +L if you are on +Win32) -- consult L and +its subclasses for additional information. =head2 Configure Authentication -Although C<__PACKAGE__-Econfig(name =E 'value');> is still supported, newer Catalyst applications tend to place all configuration information in C and automatically load this information into Cconfig> using the L plugin. - -Edit the C YAML and update it to match: +Although C<__PACKAGE__-Econfig(name =E 'value');> is still +supported, newer Catalyst applications tend to place all configuration +information in C and automatically load this information into +Cconfig> using the +L plugin. Here, we need +to load several parameters that tell +L +where to locate information in your database. To do this, edit the +C YAML and update it to match: --- name: MyApp @@ -364,7 +385,7 @@ Edit the C YAML and update it to match: # This is the model object created by Catalyst::Model::DBIC from your # schema (you created 'MyAppDB::User' but as the Catalyst startup # debug messages show, it was loaded as 'MyApp::Model::MyAppDB::User'). - # NOTE: Omit 'MyAppDB::Model' to avoid a component lookup issue in Catalyst 5.66 + # NOTE: Omit 'MyApp::Model' to avoid a component lookup issue in Catalyst 5.66 user_class: MyAppDB::User # This is the name of the field in your 'users' table that contains the user's name user_field: username @@ -374,7 +395,11 @@ Edit the C YAML and update it to match: Inline comments in the code above explain how each field is being used. -B: Although YAML uses a very simple and easy-to-ready format, it does require the use of a consistent level of indenting. Be sure you line up everything on a given 'level' with the same number of indents. Also, be sure not to use C characters (YAML does not support them because they are handled inconsistently across editors). +B: Although YAML uses a very simple and easy-to-ready format, it +does require the use of a consistent level of indenting. Be sure you +line up everything on a given 'level' with the same number of indents. +Also, be sure not to use C characters (YAML does not support them +because they are handled inconsistently across editors). =head2 Add Login and Logout Controllers @@ -384,17 +409,26 @@ Use the Catalyst create script to create two stub controller files: $ script/myapp_create.pl controller Login $ script/myapp_create.pl controller Logout -B: You could easily use a single controller here. For example, you could have a C controller with both C and C actions. Remember, Catalyst is designed to be very flexible, and leaves such matters up to you, the designer and programmer. +B: You could easily use a single controller here. For example, +you could have a C controller with both C and C +actions. Remember, Catalyst is designed to be very flexible, and leaves +such matters up to you, the designer and programmer. -Then open C and add: +Then open C, locate the C method (this was automatically inserted by the helpers when we +created the Login controller above), and delete this line: - =head2 default + $c->response->body('Matched MyApp::Controller::Login in Login.'); + +Then update it to match: + + =head2 base Login logic =cut - sub default : Private { + sub index : Private { my ($self, $c) = @_; # Get the username and password from form @@ -418,26 +452,53 @@ Then open C and add: $c->stash->{template} = 'login.tt2'; } -This controller fetches the C and C values from the login form and attempts to perform a login. If successful, it redirects the user to the book list page. If the login fails, the user will stay at the login page but receive an error message. If the C and C values are not present in the form, the user will be taken to the empty login form. +This controller fetches the C and C values from the +login form and attempts to perform a login. If successful, it redirects +the user to the book list page. If the login fails, the user will stay +at the login page but receive an error message. If the C and +C values are not present in the form, the user will be taken +to the empty login form. + +Note that we could have used something like C; +however, the use of C actions is discouraged because it does +not receive path args as with other actions. The recommended practice +is to only use C in C. + +Another options would be to use something like +C (where the C<...> refers to the login +code shown in C above). We are using C here to specifically match the URL C. +C actions (aka, "literal actions") create URI matches relative to +the namespace of the controller where they are defined. Although +C supports arguments that allow relative and absolute paths to be +defined, here we use an empty C definition to match on just the +name of the controller itself. The method name, C, is arbitrary. +We make the match even more specific with the C<:Args(0)> action +modifier -- this forces the match on I C, not +C. Next, create a corresponding method in C: - =head2 default + =head2 base Logout logic =cut - sub default : Private { + sub index : Private { my ($self, $c) = @_; # Clear the user's state $c->logout; - # Send the user to the starting + # Send the user to the starting point $c->response->redirect($c->uri_for('/')); } +As with the login controller, be sure to delete the +C<$c->response->body('Matched MyApp::Controller::Logout in Logout.');> +line of the C. + =head2 Add a Login Form TT Template Page @@ -465,9 +526,15 @@ Create a login form by opening C and inserting: =head2 Add Valid User Check -We need something that provides enforcement for the authentication mechanism -- a I mechanism that prevents users who have not passed authentication from reaching any pages except the login page. This is generally done via an C action/method (prior to Catalyst v5.66, this sort of thing would go in C, but starting in v5.66, the preferred location is C). +We need something that provides enforcement for the authentication +mechanism -- a I mechanism that prevents users who have not +passed authentication from reaching any pages except the login page. +This is generally done via an C action/method (prior to Catalyst +v5.66, this sort of thing would go in C, but starting in +v5.66, the preferred location is C). -Edit the existing C class file and insert the following method: +Edit the existing C class file and insert +the following method: =head2 auto @@ -499,30 +566,43 @@ Edit the existing C class file and insert the foll return 1; } -B Catalyst provides a number of different types of actions, such as C, C, and C. You should refer to L for a more detailed explanation, but the following bullet points provide a quick introduction: +B Catalyst provides a number of different types of actions, such +as C, C, and C. You should refer to +L for a more detailed explanation, but the +following bullet points provide a quick introduction: =over 4 =item * -The majority of application use C actions for items that respond to user requests and C actions for those that do not directly respond to user input. +The majority of application use C actions for items that respond +to user requests and C actions for those that do not directly +respond to user input. =item * -There are five types of C actions: C, C, C, C, and C. +There are five types of C actions: C, C, +C, C, and C. =item * -Unlike the other private C actions where only a single method is called for each request, I auto action along the chain of namespaces will be called. +Unlike the other actions where only a single method is called for each +request, I auto action along the chain of namespaces will be +called. =back -By placing the authentication enforcement code inside the C method of C (or C), it will be called for I request that is received by the entire application. +By placing the authentication enforcement code inside the C method +of C (or C), it will be +called for I request that is received by the entire application. =head2 Displaying Content Only to Authenticated Users -Let's say you want to provide some information on the login page that changes depending on whether the user has authenticated yet. To do this, open C in your editor and add the following lines to the bottom of the file: +Let's say you want to provide some information on the login page that +changes depending on whether the user has authenticated yet. To do +this, open C in your editor and add the following +lines to the bottom of the file:

[% @@ -543,54 +623,101 @@ Let's say you want to provide some information on the login page that changes de comments. %] -Although most of the code is comments, the middle few lines provide a "you are already logged in" reminder if the user returns to the login page after they have already authenticated. For users who have not yet authenticated, a "You need to log in..." message is displayed (note the use of an IF-THEN-ELSE construct in TT). +Although most of the code is comments, the middle few lines provide a +"you are already logged in" reminder if the user returns to the login +page after they have already authenticated. For users who have not yet +authenticated, a "You need to log in..." message is displayed (note the +use of an IF-THEN-ELSE construct in TT). =head2 Try Out Authentication -Press C to kill the previous server instance (if it's still running) and -restart it: +Press C to kill the previous server instance (if it's still +running) and restart it: $ script/myapp_server.pl -B: If you happen to be using Internet Explorer, you may need to use the command C