Apache-AuthCAS
view release on metacpan or search on metacpan
lib/Apache/AuthCAS.pm view on Meta::CPAN
if ($tmp = $r->dir_config("CASPort")) {
$CAS_PORT = $tmp;
Apache->warn("$$: CAS: initialize(): setting cas port to $CAS_PORT") unless ($LOG_LEVEL < $LOG_INFO);
} elsif ($PRODUCTION) {
$CAS_PORT = $PROD_CAS_PORT;
Apache->warn("$$: CAS: initialize(): setting cas port to $CAS_PORT") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$CAS_PORT = $DEVEL_CAS_PORT;
Apache->warn("$$: CAS: initialize(): setting cas port to $CAS_PORT") unless ($LOG_LEVEL < $LOG_INFO);
}
# CAS URIs
if ($tmp = $r->dir_config("CASLoginURI")) {
$CAS_LOGIN_URI = $tmp;
Apache->warn("$$: CAS: initialize(): setting CASLoginURI to $CAS_LOGIN_URI") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$CAS_LOGIN_URI = $DEFAULT_CAS_LOGIN_URI;
}
if ($tmp = $r->dir_config("CASLogoutURI")) {
$CAS_LOGOUT_URI = $tmp;
Apache->warn("$$: CAS: initialize(): setting CASLogoutURI to $CAS_LOGOUT_URI") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$CAS_LOGOUT_URI = $DEFAULT_CAS_LOGOUT_URI;
}
if ($tmp = $r->dir_config("CASProxyURI")) {
$CAS_PROXY_URI = $tmp;
Apache->warn("$$: CAS: initialize(): setting CASProxyURI to $CAS_PROXY_URI") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$CAS_PROXY_URI = $DEFAULT_CAS_PROXY_URI;
}
if ($tmp = $r->dir_config("CASProxyValidateURI")) {
$CAS_PROXY_VALIDATE_URI = $tmp;
Apache->warn("$$: CAS: initialize(): setting CASProxyValidateURI to $CAS_PROXY_VALIDATE_URI") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$CAS_PROXY_VALIDATE_URI = $DEFAULT_CAS_PROXY_VALIDATE_URI;
}
if ($tmp = $r->dir_config("CASServiceValidateURI")) {
$CAS_SERVICE_VALIDATE_URI = $tmp;
Apache->warn("$$: CAS: initialize(): setting CASServiceValidateURI to $CAS_SERVICE_VALIDATE_URI") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$CAS_SERVICE_VALIDATE_URI = $DEFAULT_CAS_SERVICE_VALIDATE_URI;
}
# number of proxy tickets to add to the request
if ($tmp = $r->dir_config("CASNumProxyTickets")) {
$NUM_PROXY_TICKETS = $tmp;
Apache->warn("$$: CAS: initialize(): setting CASNumProxyTickets to $NUM_PROXY_TICKETS") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$NUM_PROXY_TICKETS = $DEFAULT_NUM_PROXY_TICKETS;
}
# session settings
if ($tmp = $r->dir_config("CASSessionCookieName")) {
$SESSION_COOKIE_NAME = $tmp;
Apache->warn("$$: CAS: initialize(): setting CASSessionCookieName to $SESSION_COOKIE_NAME") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$SESSION_COOKIE_NAME = $DEFAULT_SESSION_COOKIE_NAME;
}
if ($tmp = $r->dir_config("CASSessionCookieDomain")) {
$SESSION_COOKIE_DOMAIN = $tmp;
Apache->warn("$$: CAS: initialize(): setting CASSessionCookieDomain to $SESSION_COOKIE_DOMAIN") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$SESSION_COOKIE_DOMAIN = $DEFAULT_SESSION_COOKIE_DOMAIN;
}
if ($tmp = $r->dir_config("CASSessionTimeout")) {
$SESSION_TIMEOUT= $tmp;
Apache->warn("$$: CAS: initialize(): setting CASSessionTimeout to $SESSION_TIMEOUT") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$SESSION_TIMEOUT= $DEFAULT_SESSION_TIMEOUT;
}
# database settings
if ($tmp = $r->dir_config("CASDatabaseDriver")) {
$DB_DRIVER = $tmp;
Apache->warn("$$: CAS: initialize(): setting database driver to $DB_DRIVER") unless ($LOG_LEVEL < $LOG_INFO);
} elsif ($PRODUCTION) {
$DB_DRIVER = $PROD_DB_DRIVER;
Apache->warn("$$: CAS: initialize(): setting database driver to $DB_DRIVER") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$DB_DRIVER = $DEVEL_DB_DRIVER;
Apache->warn("$$: CAS: initialize(): setting database driver to $DB_DRIVER") unless ($LOG_LEVEL < $LOG_INFO);
}
if ($tmp = $r->dir_config("CASDatabaseHost")) {
$DB_HOST = $tmp;
Apache->warn("$$: CAS: initialize(): setting database host to $DB_HOST") unless ($LOG_LEVEL < $LOG_INFO);
} elsif ($PRODUCTION) {
$DB_HOST = $PROD_DB_HOST;
Apache->warn("$$: CAS: initialize(): setting database host to $DB_HOST") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$DB_HOST = $DEVEL_DB_HOST;
Apache->warn("$$: CAS: initialize(): setting database host to $DB_HOST") unless ($LOG_LEVEL < $LOG_INFO);
}
if ($tmp = $r->dir_config("CASDatabasePort")) {
$DB_PORT = $tmp;
Apache->warn("$$: CAS: initialize(): setting database port to $DB_PORT") unless ($LOG_LEVEL < $LOG_INFO);
} elsif ($PRODUCTION) {
$DB_PORT = $PROD_DB_PORT;
Apache->warn("$$: CAS: initialize(): setting database port to $DB_PORT") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$DB_PORT = $DEVEL_DB_PORT;
Apache->warn("$$: CAS: initialize(): setting database port to $DB_PORT") unless ($LOG_LEVEL < $LOG_INFO);
}
if ($tmp = $r->dir_config("CASDatabaseName")) {
$DB_NAME = $tmp;
Apache->warn("$$: CAS: initialize(): setting database name to $DB_NAME") unless ($LOG_LEVEL < $LOG_INFO);
} elsif ($PRODUCTION) {
$DB_NAME = $PROD_DB_NAME;
Apache->warn("$$: CAS: initialize(): setting database name to $DB_NAME") unless ($LOG_LEVEL < $LOG_INFO);
} else {
# default
$DB_NAME = $DEVEL_DB_NAME;
Apache->warn("$$: CAS: initialize(): setting database name to $DB_NAME") unless ($LOG_LEVEL < $LOG_INFO);
}
if ($tmp = $r->dir_config("CASDatabaseSessionTable")) {
$DB_SESSION_TABLE = $tmp;
lib/Apache/AuthCAS.pm view on Meta::CPAN
# Parse the query string to get the ticket, plus any GET variables
# to rebuild our service string (which is needed for CAS to send the
# client back to the originating service).
# grab the uri that was requested
my $uri = $r->parsed_uri;
my $path = $uri->path();
my $unparsed = $uri->unparse();
my $query = $uri->query || "";
if ($query) {
$path .= "?$query";
} elsif ($unparsed =~ /\?$/) {
$path .= "?";
}
# grab out the params we need to use for tests
my $ticket = "";
my $pgt = "";
my $pgtiou = "";
if ($query ne "") {
my @params = split(/&/, $query);
foreach (@params) {
my ($key, $value) = split(/=/, $_);
Apache->warn("$$: CAS: authenticate(): PARAMS: '$key' => '$value'") unless ($LOG_LEVEL < $LOG_DEBUG);
if ($key eq "ticket") {
Apache->warn("$$: CAS: authenticate(): ticket found: '$value'") unless ($LOG_LEVEL < $LOG_DEBUG);
$ticket = $value || "";
}
if ($key eq $PGT_ID_PARAM) {
Apache->warn("$$: CAS: authenticate(): PGTID found: '$value'") unless ($LOG_LEVEL < $LOG_DEBUG);
$pgt = $value;
}
if ($key eq $PGT_IOU_PARAM) {
Apache->warn("$$: CAS: authenticate(): PGTIOU found: '$value'") unless ($LOG_LEVEL < $LOG_DEBUG);
$pgtiou = $value;
}
}
}
# this is the proxy receptor, should only enter here when CAS sends us the
# PGTIOU and the PGT
if (($pgtiou ne "") and ($pgt ne "")) {
Apache->warn("$$: CAS: authenticate(): proxy receptor invoked with '$pgtiou' => '$pgt'") unless ($LOG_LEVEL < $LOG_DEBUG);
# save the pgtiou/pgt mapping
if (!$self->set_pgt($pgtiou, $pgt)) {
Apache->warn("$$: CAS: authenticate(): couldn't save '$pgtiou' => '$pgt', redirecting to error page") unless ($LOG_LEVEL < $LOG_ERROR);
return $self->redirect($r, $ERROR_URL, $DB_ERROR_CODE);
}
Apache->warn("$$: CAS: authenticate(): saved '$pgtiou' => '$pgt'") unless ($LOG_LEVEL < $LOG_DEBUG);
# return a successful response to CAS
# have to not let request fall through to real content here
$r->push_handlers(PerlResponseHandler => \&send_proxysuccess);
} # else treat this as a normal authentication request
# determine any session cookies/session id we may have recieved
my ($cookie, $sid) = ("", "");
if (!defined($cookie = $r->header_in('Cookie'))) {
# if we don't have a session cookie, the user can't be valid
Apache->warn("$$: CAS: authenticate(): no session cookie found") unless ($LOG_LEVEL < $LOG_DEBUG);
my $service;
if ($SERVICE eq "") {
# use the current URL as the service
$service = $self->this_url_encoded($r);
} else {
# use the static entry point into this service
$service = $self->urlEncode($SERVICE);
}
Apache->warn("$$: CAS: authenticate(): no session cookie for service: '$service'") unless ($LOG_LEVEL < $LOG_DEBUG);
} else {
# we have a session cookie, so we need to get the session id
Apache->warn("$$: CAS: authenticate(): cookie found: '$cookie'") unless ($LOG_LEVEL < $LOG_DEBUG);
# get session id from the cookie
$cookie =~ /.*$SESSION_COOKIE_NAME=([^;]+)(\s*;.*|\s*$)/;
$sid = $1 || "";
if (!$sid) {
# no sessions id in cookie?
Apache->warn("$$: CAS: authenticate(): no session id found in cookie: '$cookie'") unless ($LOG_LEVEL < $LOG_DEBUG);
} else {
Apache->warn("$$: CAS: authenticate(): session id '$sid' found in cookie: '$cookie'") unless ($LOG_LEVEL < $LOG_DEBUG);
}
}
# if we don't have a session id and there is no service ticket, redirect
# the user to CAS (they have never been authenticated)
if (!$ticket and !$sid) {
Apache->warn("$$: CAS: authenticate(): no ticket and no cookie, redirecting to login") unless ($LOG_LEVEL < $LOG_DEBUG);
return $self->redirect_login($r);
}
# note: we should have a session id or a service ticket.
# if we have a session id
my $user="";
if ($sid) {
# we set up our own session here, so that we don't have to continually
# go through this whole process! we associate a session id with a
# PGTIOU
# try to get a session record for the session id we recieved
my @session_data; # session id, last accessed, netid, pgtiou
if (@session_data = $self->get_session_data($sid)) {
Apache->warn("$$: CAS: authenticate(): session data: ".join(",",@session_data)) unless ($LOG_LEVEL < $LOG_DEBUG);
# we found the session id in out session hash
my $last_accessed = $session_data[1];
# make sure the session is still valid
Apache->warn("$$: CAS: authenticate(): session last_accessed=$last_accessed") unless ($LOG_LEVEL < $LOG_DEBUG);
if ($last_accessed + $SESSION_TIMEOUT >= time()) {
# session is still valid
Apache->warn("$$: CAS: authenticate(): session '$sid' is still valid") unless ($LOG_LEVEL < $LOG_DEBUG);
# record the last time the session was accessed
$session_data[1] = time();
Apache->warn("$$: CAS: authenticate(): setting last accessed time to '".time()."'") unless ($LOG_LEVEL < $LOG_DEBUG);
lib/Apache/AuthCAS.pm view on Meta::CPAN
return (MP2 ? Apache::OK : Apache::Constants::OK);
}
} else {
Apache->warn("$$: CAS: authenticate(): session '$sid' has expired") unless ($LOG_LEVEL < $LOG_DEBUG);
if (!$self->delete_session_data($sid)) {
Apache->warn("$$: CAS: authenticate(): couldn't delete expired session id='$sid'") unless ($LOG_LEVEL < $LOG_WARN);
}
Apache->warn("$$: CAS: authenticate(): deleted expired session '$sid'") unless ($LOG_LEVEL < $LOG_DEBUG);
$sid = "";
}
} else {
Apache->warn("$$: CAS: authenticate(): session '$sid' is invalid") unless ($LOG_LEVEL < $LOG_DEBUG);
$sid = "";
}
}
# note: not an else if, because we may find an invalid session id and
# fallback to ticket
# if we have a service ticket
if (($sid eq "") and ($ticket ne "")) {
# validate service ticket through CAS, since no valid cookie was found
my %properties = $self->validate_service_ticket($r, $ticket, $PROXY_SERVICE ?"1":"0");
if ($properties{'error'}) {
# error occurred validating service ticket
return $self->redirect($r, $ERROR_URL, $properties{'error'});
} else {
Apache->warn("$$: CAS: authenticate(): valid service ticket '$ticket'") unless ($LOG_LEVEL < $LOG_DEBUG);
}
$pgtiou = $properties{'pgtiou'} || "";
$user = $properties{'user'} || "";
# we should get back a netid when validating a service ticket
if ($user eq "") {
return $self->redirect($r, $ERROR_URL, $MISSING_NETID_ERROR_CODE);
}
$sid = &create_session_id();
Apache->warn("$$: CAS: authenticate(): setting sid='$sid' for netid='$user'") unless ($LOG_LEVEL < $LOG_DEBUG);
# map a new session id to this pgtiou and give the client a cookie
my $time = time();
Apache->warn("$$: CAS: authenticate(): trying to save session data: ".join(",",$sid, $time, $user, $pgtiou)) unless ($LOG_LEVEL < $LOG_DEBUG);
if (!$self->set_session_data($sid, $time, $user, $pgtiou)) {
# if something bad happened, like database unavailability
Apache->warn("$$: CAS: authenticate(): problem saving session data, redirecting to the error page") unless ($LOG_LEVEL < $LOG_ERROR);
return $self->redirect($r, $ERROR_URL, $DB_ERROR_CODE);
} else {
Apache->warn("$$: CAS: authenticate(): saved session data: ".join(",",$sid, $time, $user, $pgtiou)) unless ($LOG_LEVEL < $LOG_DEBUG);
}
Apache->warn("$$: CAS: authenticate(): sending session cookie") unless ($LOG_LEVEL < $LOG_DEBUG);
my $cookie = "$SESSION_COOKIE_NAME=$sid;path=/";
if ($SESSION_COOKIE_DOMAIN ne "") {
$cookie .= ";domain=.$SESSION_COOKIE_DOMAIN";
}
# send the cookie to the browser
$r->header_out("Set-Cookie" => $cookie);
# in case we redirect (considered an "error")
$r->err_header_out("Set-Cookie" => $cookie);
} else {
Apache->warn("$$: CAS: authenticate(): no valid session id or ticket") unless ($LOG_LEVEL < $LOG_DEBUG);
return $self->redirect_login($r);
}
Apache->warn("$$: CAS: authenticate(): got user: '$user'") unless ($LOG_LEVEL < $LOG_DEBUG);
Apache->warn("$$: CAS: authenticate(): got PGTIOU: '$pgtiou'") unless ($LOG_LEVEL < $LOG_DEBUG);
if ($PROXY_SERVICE) {
return $self->do_proxy($r, $sid, $pgtiou, $user, 1);
} else {
# no proxy stuff, so we are done
Apache->warn("$$: CAS: authenticate(): no proxy stuff, so we are done") unless ($LOG_LEVEL < $LOG_DEBUG);
# redirect to this same page minus the ticket
if (($REMOVE_TICKET eq "true") || ($REMOVE_TICKET eq "1")) {
Apache->warn("$$: CAS: authenticate(): setting header CAS_FILTER_USER=$user") unless ($LOG_LEVEL < $LOG_DEBUG);
$r->header_in('CAS_FILTER_USER', $user);
if ($PRETEND_BASIC_AUTH) {
# setup this up for underlying authz modules that rely on Basic auth having been performed
$r->header_in('Authorization', "Basic " . encode_base64($user . ":DUMMYPASS"));
$r->user($user);
$r->connection->user($user);
$r->connection->auth_type("Basic");
}
Apache->warn("$$: CAS: authenticate(): trying to remove service ticket from URI") unless ($LOG_LEVEL < $LOG_DEBUG);
return $self->redirect_without_ticket($r);
} else {
Apache->warn("$$: CAS: authenticate(): setting header CAS_FILTER_USER=$user") unless ($LOG_LEVEL < $LOG_DEBUG);
$r->header_in('CAS_FILTER_USER', $user);
if ($PRETEND_BASIC_AUTH) {
# setup this up for underlying authz modules that rely on Basic auth having been performed
$r->header_in('Authorization', "Basic " . encode_base64($user . ":DUMMYPASS"));
$r->user($user);
$r->connection->user($user);
$r->connection->auth_type("Basic");
}
Apache->warn("$$: CAS: authenticate(): not trying to remove service ticket from URI") unless ($LOG_LEVEL < $LOG_DEBUG);
return (MP2 ? Apache::OK : Apache::Constants::OK);
}
}
# failed if we got this far, but shouldn't
return (MP2 ? Apache::FORBIDDEN : Apache::Constants::FORBIDDEN);
}
sub cleanup($$) {
my $self = shift;
my $r = shift;
$SESSION_CLEANUP_COUNTER++;
Apache->warn("$$: CAS: cleanup(): counter=$SESSION_CLEANUP_COUNTER") unless ($LOG_LEVEL < $LOG_DEBUG);
# perform session cleanup
if ($SESSION_CLEANUP_COUNTER == 1) {
Apache->warn("$$: CAS: initialize(): performing session cleanup");
lib/Apache/AuthCAS.pm view on Meta::CPAN
PerlAuthenHandler Apache::AuthCAS->authenticate
require valid-user
*note* - this simple config assumes that custom settings are configured
into the module itself. If not, they will need to be specified
with PerlSetVar params (see below for examples).
You can configure this module by placing the devel/production settings in the
module itself. This is particular handy if you would like to make
authentication with this module available via .htaccess to users whom you would
rather not share the database username/password with.
Any options that are not set in the Apache configuration will default to the
values preconfigured in the Apache::AuthCAS module. Either explicitly override
those options that do not match your environment or set them in the module
itself.
The I<Apache::AuthCAS> module allows a user to protect their non-Java content
on an Apache server with the Yale CAS authentication server.
=head2 Requirements
Perl modules:
Net::SSLeay
MIME::Base64
DBI
DBD::<module name> (i.e. DBD::Pg)
=head2 Proxiable Credentials
This module can be optionally configured to use proxy credentials. This is
enabled by setting the I<CASService> and I<CASProxyService> configuration
parameters.
=head2 Examples
Example configuration without proxiable credentials, which assumes that the
module itself has been configured with devel and production variables set:
AuthType Apache::AuthCAS
AuthName "CAS"
PerlAuthenHandler Apache::AuthCAS->authenticate
PerlSetVar CASProduction "1"
require valid-user
Example configuration without proxiable credentials, which has not been
modified:
AuthType Apache::AuthCAS
AuthName "CAS"
PerlAuthenHandler Apache::AuthCAS->authenticate
PerlSetVar CASHost "auth.somedomain.com"
PerlSetVar CASPort "443"
PerlSetVar CASErrorURL "https://somedomain.com/cas/error/"
PerlSetVar CASDatabaseName "cas"
PerlSetVar CASDatabaseHost "db.somedomain.com"
PerlSetVar CASDatabasePort "5432"
PerlSetVar CASDatabaseDriver "Pg"
PerlSetVar CASDatabaseUser "dbuser"
PerlSetVar CASDatabasePass "dbpass"
PerlSetVar CASSessionCookieName "APACHECAS"
PerlSetVar CASSessionTimeout "1800"
PerlSetVar CASLogLevel "0"
PerlSetVar CASRemoveTicket "false"
require valid-user
Example configuration with proxiable credentials, which assumes that the module
itself has been configured with devel and production variables set:
AuthType Apache::AuthCAS
AuthName "CAS"
PerlAuthenHandler Apache::AuthCAS->authenticate
PerlSetVar CASProduction "1"
PerlSetVar CASService "https://somedomain.com/email/"
PerlSetVar CASProxyService "mail.somedomain.com"
require valid-user
Example configuration with proxiable credentials, which has not been modified:
AuthType Apache::AuthCAS
AuthName "CAS"
PerlAuthenHandler Apache::AuthCAS->authenticate
PerlSetVar CASService "https://somedomain.com/email/"
PerlSetVar CASProxyService "mail.somedomain.com"
PerlSetVar CASNumProxyTickets "1"
PerlSetVar CASHost "auth.somedomain.com"
PerlSetVar CASPort "443"
PerlSetVar CASErrorURL "https://somedomain.com/cas/error/"
PerlSetVar CASDatabaseName "cas"
PerlSetVar CASDatabaseHost "db.somedomain.com"
PerlSetVar CASDatabasePort "5432"
PerlSetVar CASDatabaseDriver "Pg"
PerlSetVar CASDatabaseUser "dbuser"
PerlSetVar CASDatabasePass "dbpass"
PerlSetVar CASSessionCookieName "APACHECAS"
PerlSetVar CASSessionTimeout "1800"
PerlSetVar CASLogLevel "0"
PerlSetVar CASRemoveTicket "false"
require valid-user
=head2 Configuration Options
These are Apache configuration option examples for Apache::AuthCAS
# the host name of the CAS server
PerlSetVar CASHost "auth.somedomain.com"
# the port number for the CAS server
PerlSetVar CASPort "443"
# are we running with production config or dev config
PerlSetVar CASProduction "1"
# the URL a client is redirected to after logging in
PerlSetVar CASService "https://somedomain.com/email/"
# the service proxy tickets will be granted for
PerlSetVar CASProxyService "mail.somedomain.com"
# number of proxy tickets to give the underlying application
PerlSetVar CASNumProxyTickets "2"
# the URL the client is redirected to when an error occurs
PerlSetVar CASErrorURL "https://somedomain.com/error/"
# the name of the DBI database driver
PerlSetVar CASDatabaseDriver "Pg"
# the host name of the database server
PerlSetVar CASDatabaseHost "db.somedomain.com"
# the port number of the database server
PerlSetVar CASDatabasePort "5433"
# the name of the database for sessions/pgtiou mapping
PerlSetVar CASDatabaseName "cas"
# the user to connnect to the database with
PerlSetVar CASDatabaseUser "dbuser"
# the password to connect to the databse with
PerlSetVar CASDatabasePass "dbpass"
# the name of the session table
PerlSetVar CASDatabaseSessionTable "cas_sessions"
# the name of the pgtiou to pgt mapping table
PerlSetVar CASDatabasePGTIOUTable "cas_pgtiou_to_pgt"
# the level of logging
PerlSetVar CASLogLevel "4"
# whether we should perform a redirect, stripping the service ticket
# once we have already created a session for the client
PerlSetVar CASRemoveTicket "true"
# the name of the cookie that will be used for sessions
PerlSetVar CASSessionCookieName "APACHECAS"
# the max time before a session expires (in seconds)
PerlSetVar CASSessionTimeout "1800"
# not currently able to override through Apache configuration:
# CAS login URI
# CAS logout URI
# CAS proxy URI
# CAS proxy validate URI
# CAS service validate URI
# parameter used to pass in PGTIOU
# parameter used to pass in PGT
# session cleanup threshold
# basic authentication emulation
=head1 NOTES
Any options that are not set in the Apache configuration will default to the
values preconfigured in the Apache::AuthCAS module. Either explicitly override
those options that do not match your environment or set them in the module
itself.
=head1 COMPATIBILITY
This module should work in both mod_perl 1 and 2. For Apache 2/mod_perl 2, the
Apache::compat may need to be loaded in your mod_perl startup script. This can
be done by adding:
use Apache::compat;
into the script included by the PerlRequire directive in your Apache
configuration. For instance, if your Apache configuration includes the line:
PerlRequire /usr/local/sbin/modperl_startup.pl
then the "use" line mentioned above should be added to this file. Consult the
mod_perl documentation for more information regarding mod_perl startup scripts.
=head1 SEE ALSO
=head2 Official Yale CAS Website
http://www.yale.edu/tp/auth/
=head2 mod_perl Documentation
http://perl.apache.org/
=head1 AUTHOR
David Castro <dcastro@apu.edu>
=head1 COPYRIGHT
Copyright (C) 2004 David Castro <dcastro@apu.edu>
This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version.
( run in 1.288 second using v1.01-cache-2.11-cpan-39bf76dae61 )