Eine gängige Methode zur Auhentifizierung bei Versendung vom Apache is mod_auth_mysql. Ohne ein Interface um Benutzer und ggf. Gruppen einzutragen ist dieses Vorgehen aber nicht für jeden geeignet.
Das ServiceManagementtool i-doit ist in der Lage Benutzer und Gruppen in MySQL abzulegen und hat demzufolge auch entsprechende Masken für Benutzer und Gruppen.
Hat man nur Nagios auf seinem Server kommt man auch mit Benutzern aus. Aber spätenstens, wenn man auf dem gleichen Server i-doit fährt hat man 2 Baustellen. Wenn noch mehr Funktionen dazu kommen (Zentraler Zugriff auf Logfiles, zentraler Einstiegspunkt f.d. Bereitschaft, Verwaltung von Steckdosenleisten etc.) ergeben sich sehr schnell Berechtigungskontrukte, die die Verwendung von Gruppen erforderlich machen (zumindest wars bei mir so).
i-doit hat ein komfortables Interface um Benutzer und Gruppen zu erstellen und zu pflegen.
Die Beschreibung von mod_auth_mysql ist leider ziemlich rudimentär so dass man sich etwas wie H.Ford auf der Jagd nach den verlorenen Informationen fühlt. Insbesondere wie man gegen mehrere MySQL-Tabellen authentifiziert ist nicht auf Anhieb transparent.
Voraussetzung:
Die entsprechende Include-Datei für Apache sieht dann so aus:
Für RedHat und CentOS
ScriptAlias /nagios/cgi-bin "/usr/lib64/nagios/cgi" <Directory "/usr/lib64/nagios/cgi"> AllowOverride None Options ExecCGI Order deny,allow Allow from all AuthName "Nagios Access" AuthType Basic AuthMySQLEnable on AuthMySQLHost "mysqlsrv" AuthMySQLDB ops_data AuthMySQLPwEncryption md5 AuthMySQLUserTable isys_person_intern AuthMySQLUser nagios AuthMySQLPassword deathbird AuthMySQLNameField isys_person_intern__title AuthMySQLPasswordField isys_person_intern__user_pass AuthMySQLGroupTable isys_person_intern,isys_group,isys_group_2_isys_person_intern AuthMySQLGroupField isys_group__title AuthMySQLGroupCondition "isys_person_intern.isys_person_intern__id=isys_group_2_isys_person_intern.isys_group_2_isys_person_intern_ _isys_person_intern__id and isys_group_2_isys_person_intern.isys_group_2_isys_person_intern__isys_group__id=isys_group.isys_group__id and isys_group__title='nagios'" AuthMySQLAuthoritative On AuthMySQLNoPasswd Off require group nagios </Directory> Alias /nagios "/usr/share/nagios" <Directory "/usr/share/nagios"> AllowOverride None Options None Order deny,allow Allow from all </Directory>
Für Debian und Ubuntu
ScriptAlias /nagios/cgi-bin "/usr/local/nagios/sbin" <Directory "/usr/local/nagios/sbin"> AllowOverride None Options ExecCGI Order deny,allow Allow from all AuthName "Nagios Access" AuthType Basic AuthUserFile /dev/null AuthBasicAuthoritative Off AuthMySQL_Authoritative on AuthMYSQL on AuthMySQL_Host "MYSQLHOST" AuthMySQL_User MYSQLUSERNAME AuthMySQL_Password MYSQLPASSWORT AuthMySQL_DB idoit_data AuthMySQL_Encryption_Types PHP_MD5 AuthMySQL_Password_Table isys_person_intern AuthMySQL_Username_Field isys_person_intern__title AuthMySQL_Password_Field isys_person_intern__user_pass AuthMySQL_Empty_Passwords off AuthMySQL_Group_Table isys_person_intern,isys_group,isys_group_2_isys_person_intern AuthMySQL_Group_Field isys_group__title Auth_MySQL_Group_Clause " AND isys_person_intern.isys_person_intern__id=isys_group_2_isys_person_intern.isys_group_2_isys_person_intern__isys_person_intern__id and isys_group_2_isys_person_intern.isys_group_2_isys_person_intern__isys_group__id=isys_group.isys_group__id and isys_group__title='nagios'" require group nagios </Directory> Alias /nagios "/usr/local/nagios/share" <Directory "/usr/local/nagios/share"> Options None AllowOverride None Order allow,deny Allow from all </Directory>
Der Inhalt von AuthMySQLGroupCondition ist im Prinzip ein SQL-Statement (select). Gleiches gilt für AuthMySQLGroupTable. Hier ist es ein Join über 3 Tabellen.
Die Statements für andere Sachen (z.B. Logfiles etc.) sind analog aufzubauen.
Nun hat natürlich nicht jeder Benutzer des Nagios, wie z.B. Fachabteilungen, aber auch das recht, sich an i-doit anzumelden. Dafür habe ich ein kleine Perlprogramm (CGI) geschrieben, mit dem Benutzer ihr passwort selben ändern können:
#!/usr/bin/perl
use strict;
use DBI;
use CGI qw(:cgi-lib);
use vars qw($PASSWORD $USERNAME $DBLOGIN $DBPASS $DATABASE $DBHOST $DBPORT $SQLSTATEMENT $OLD_PASSWORD);
use vars qw($ERRMSG $PASSWORD1 $STH $DBH %in $PASSWORD2 $DSN @ROW);
$DBLOGIN = "changepw";
$DBPASS = "changepw";
$DATABASE = "i-doit_data";
$DBHOST = "mysqlsrv";
$DBPORT = 3306;
$ERRMSG = "";
# Main part ------------------------------------------------------------------------
header();
ReadParse();
# Lesen der Formularfelder auf den Hash '%in'
$PASSWORD = $in{login_password};
$USERNAME = $in{login_username};
$PASSWORD1 = $in{login_pass1};
$PASSWORD2 = $in{login_pass2};
# Test if the new password is typed in correctly
if ( $PASSWORD1 ne $PASSWORD2)
{
$ERRMSG = "Error! Passwords not equal! Please try it again.";
error();
footer();
exit;
}
# Connect to the database ----------------------------------------------------------
$DSN = "DBI:mysql:database=$DATABASE;host=$DBHOST;port=$DBPORT";
$DBH = DBI->connect($DSN, $DBLOGIN, $DBPASS, {
PrintError => 0, ### Don't report errors via warn( )
RaiseError => 1 ### Do report errors via die( )
} );
# Constuct a SQL statement ----------------------------------------------------------
# Place the password as MD5 hash into the database for comparing
$SQLSTATEMENT = "insert into tmp_ops_person";
$SQLSTATEMENT = $SQLSTATEMENT." VALUES ('',\'$USERNAME\', MD5( \'$PASSWORD\' ) )";
# ----- Prepare a SQL statement for execution
$STH = $DBH->prepare( $SQLSTATEMENT );
# ----- Execute the statement in the database
$STH->execute();
# Constuct a SQL statement ----------------------------------------------------------
# Now we get the hashed password out of the database and replace the password in the
# variable with the hashed one
$SQLSTATEMENT = "select tmp_ops_person_intern_user_pass from tmp_ops_person";
$SQLSTATEMENT = $SQLSTATEMENT." where tmp_ops_person_intern__title = '$USERNAME'";
# ----- Prepare a SQL statement for execution
$STH = $DBH->prepare( $SQLSTATEMENT );
# ----- Execute the statement in the database
$STH->execute();
# ----- Retrieve the returned rows of data
while ( @ROW = $STH->fetchrow_array( ) )
{
# Put the hashed password in the var
$PASSWORD = $ROW[0];
}
# Constuct a SQL statement ----------------------------------------------------------
$SQLSTATEMENT = "select isys_person_intern__user_pass from isys_person_intern";
$SQLSTATEMENT = $SQLSTATEMENT." where isys_person_intern__title = '$USERNAME'";
# ----- Prepare a SQL statement for execution
$STH = $DBH->prepare( $SQLSTATEMENT );
# ----- Execute the statement in the database
$STH->execute();
# ----- Retrieve the returned rows of data
while ( @ROW = $STH->fetchrow_array( ) )
{
$OLD_PASSWORD = $ROW[0];
}
# Constuct a SQL statement ----------------------------------------------------------
$SQLSTATEMENT = "DELETE FROM `tmp_ops_person` where tmp_ops_person_intern__title = '$USERNAME'";
# ----- Prepare a SQL statement for execution
$STH = $DBH->prepare( $SQLSTATEMENT );
# ----- Execute the statement in the database
$STH->execute();
$DBH->disconnect;
if ( $PASSWORD ne $OLD_PASSWORD)
{
$ERRMSG = "Error! This was not your password.<br>Please retype it or ask your guru.";
error();
}
else
{
# Constuct a SQL statement ----------------------------------------------------------
$SQLSTATEMENT = "UPDATE `isys_person_intern` set `isys_person_intern__user_pass` = MD5(\'$PASSWORD1\')";
$SQLSTATEMENT = $SQLSTATEMENT." where isys_person_intern__title = '$USERNAME'";
# ----- Prepare a SQL statement for execution
$STH = $DBH->prepare( $SQLSTATEMENT );
# ----- Execute the statement in the database
$STH->execute();
success();
}
$DBH->disconnect;
exit;
footer();
# Subroutines
sub error
{
print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
print "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title>Change your password</title>\n";
print "<meta http-equiv=\"content-type\" content=\"text/html; charset=\" iso-8859-15=\"\">\n";
print "<meta http-equiv=\"content-language\" content=\"de\">\n";
print "<link rel=\"shortcut icon\" href=\"/i-doit/favicon.ico\" type=\"image/x-icon\">\n";
print "<link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"password.css\">\n";
print "\n";
print "<script type=\"text/javascript\">\n";
print "\n";
print "function live_clock()\n";
print " {\n";
print " var today = new Date();\n";
print " var second = today.getSeconds();\n";
print " var minute = today.getMinutes();\n";
print " var hour = today.getHours();\n";
print " var hour24 = today.getHours();\n";
print " var ampm = \"\";\n";
print " \n";
print " var day = today.getDay();\n";
print " var date = today.getDate();\n";
print " var month = today.getMonth();\n";
print " var year = today.getFullYear();\n";
print " \n";
print " var days = new Array();\n";
print " days[0] = \"Sunday\";\n";
print " days[1] = \"Monday\";\n";
print " days[2] = \"Tuesday\";\n";
print " days[3] = \"Wednesday\";\n";
print " days[4] = \"Thursday\";\n";
print " days[5] = \"Friday\";\n";
print " days[6] = \"Saturday\";\n";
print " \n";
print " var mns = new Array();\n";
print " mns[0] = \"January\";\n";
print " mns[1] = \"February\";\n";
print " mns[2] = \"March\";\n";
print " mns[3] = \"April\";\n";
print " mns[4] = \"May\";\n";
print " mns[5] = \"June\";\n";
print " mns[6] = \"July\";\n";
print " mns[7] = \"August\";\n";
print " mns[8] = \"September\";\n";
print " mns[9] = \"October\";\n";
print " mns[10] = \"November\";\n";
print " mns[11] = \"December\";\n";
print " \n";
print " if(second<10)\n";
print " {\n";
print " second = \"0\"+second;\n";
print " }\n";
print " if(minute<10)\n";
print " {\n";
print " minute = \"0\"+minute;\n";
print " }\n";
print " if(hour24<=12)\n";
print " {\n";
print " ampm = \"AM\";\n";
print " }\n";
print " else\n";
print " {\n";
print " ampm = \"PM\"\n";
print " }\n";
print " if(hour24>=12)\n";
print " {\n";
print " hour= hour-12;\n";
print " }\n";
print " if(hour24==0)\n";
print " {\n";
print " hour=12;\n";
print " }\n";
print "\n";
print "document.getElementById('live_clock').innerHTML=(hour+\":\"+minute+\":\"+second+\" \"+ampm+' '+days[day]+', '+date+' '+mns[month]+' '+year);\n";
print "}\n";
print "\n";
print "</script>\n";
print "\n";
print "</head>\n";
print "\n";
print "<body scroll=\"no\" onload=\"setInterval('live_clock()', 1000); fixScroll(); P7_fluidLayers('mydoitArea','5','73','215','auto',5,5,5,5); P7_fluidLayers('menuTreeOn','0','73','215','auto',5,5,5,5); P7_fluidLayers('menuTreeOff','0','73','5','auto',5,5,5,5); P7_fluidLayers('mainAreaNormal','226','73','auto','auto',5,5,5,0); P7_fluidLayers('mainAreaWide','8','73','auto','auto',5,5,5,0); onload_process();\">\n";
print "\n";
print "<div id=\"overlay\" style=\"display: none;\"></div>\n";
print "<div id=\"error\" class=\"login_error\" style=\"display: none;\"><div><span><strong>Notice</strong></span><span class=\"close\"><a onclick=\"new Effect.SwitchOff('error'); $('overlay').style.display='none';\" href=\"javascript:;\">X</a></span></div><p><span id=\"error_message\"></span></p></div>\n";
print "\n";
print "\n";
print "<form action=\"change_password.cgi\" method=\"post\" name=\"change_pass\" id=\"change_pass\" enctype=\"\">\n";
print "\n";
print "\n";
print "<!-- Clock -->\n";
print "<span id=\"live_clock\"></span>\n";
print "<!-- Clock end -->\n";
print "\n";
print "<!-- Breadcrumb navigation string begin -->\n";
print "<div id=\"breadCrumbNavi\">\n";
print " </div>\n";
print "<!-- Breadcrumb navigation string end -->\n";
print "\n";
print "<!--Banner -->\n";
print "<div id=\"banner\" style=\"overflow: hidden; height: 50px;\">\n";
print " <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n";
print " <tbody><tr>\n";
print " <td style=\"margin: 0px; padding: 0px;\" align=\"left\" height=\"50\" width=\"82\">\n";
print " <img src=\"change_password_files/oce_logo.gif\" border=\"0\">\n";
print " \n";
print " </td>\n";
print " <td style=\"margin: 0px; padding: 0px; overflow: hidden;\" align=\"right\" width=\"394\">\n";
print " </td>\n";
print " <td style=\"margin: 0px; padding: 0px; overflow: hidden;\" align=\"right\" height=\"50\" width=\"100%\">\n";
print " </td>\n";
print " <td style=\"margin: 0px; padding: 0px; overflow: hidden;\" align=\"right\" width=\"211\">\n";
print " </td>\n";
print " </tr>\n";
print " </tbody></table>\n";
print "</div>\n";
print "\n";
print "\n";
print "\n";
print "<div id=\"loginInnerArea\">\n";
print " \n";
print " <table id=\"loginInnerTable\" cellpadding=\"0\" cellspacing=\"0\">\n";
print " <tbody><tr>\n";
print " <td>\n";
print " <tr>\n";
print " <td align=\"center\"><br>$ERRMSG</td>\n";
print " </tr>\n";
print " </td>\n";
print " <td>\n";
print " <div id=\"loginContent\">\n";
print " <table id=\"loginTable\" align=\"right\" cellpadding=\"2\" cellspacing=\"0\">\n";
print " <tbody><tr>\n";
print " <td>Username: </td>\n";
print " <td>\n";
print " <input class=\"inputTextLogin\" name=\"login_username\" id=\"login_username\" value=\"$USERNAME\" onkeyup=\"if(event.keyCode==13)this.form.submit();\" type=\"input\">\n";
print " </td>\n";
print " </tr>\n";
print " <tr>\n";
print " <td>Password: </td>\n";
print " <td><input class=\"inputTextLogin\" name=\"login_password\" id=\"login_password\" onkeyup=\"if(event.keyCode==13)this.form.submit();\" type=\"password\"></td>\n";
print " </tr>\n";
print " <tr>\n";
print " <td>New Password: </td>\n";
print " <td><input class=\"inputTextLogin\" name=\"login_pass1\" id=\"login_pass1\" onkeyup=\"if(event.keyCode==13)this.form.submit();\" type=\"password\"></td>\n";
print " </tr>\n";
print " <tr>\n";
print " <td>Retype New Password: </td>\n";
print " <td><input class=\"inputTextLogin\" name=\"login_pass2\" id=\"login_pass2\" onkeyup=\"if(event.keyCode==13)this.form.submit();\" type=\"password\"></td>\n";
print " </tr>\n";
print " <tr>\n";
print " <td colspan=\"2\">\n";
print " <div id=\"login_submit\">\n";
print " <input name=\"login_submit\" value=\"Change\" class=\"button\" style=\"margin-right: 5px; cursor: pointer;\" onclick=\"this.form.submit();\" onmouseover=\"this.className='buttonActive'; this.style.cursor='pointer';\" onmouseout=\"this.className='button'; \" type=\"button\">\n";
print " </div>\n";
print " </td>\n";
print " </tr>\n";
print " </tbody></table>\n";
print " </div>\n";
print " </td>\n";
print " </tr>\n";
print " </tbody></table>\n";
print " \n";
print "</div>\n";
print " </div>\n";
print " <!-- END: TOM GROUP: login| //--> </form>\n";
print "</body></html>\n";
}
sub success
{
print "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
print "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><title>Change your password</title>\n";
print "<meta http-equiv=\"content-type\" content=\"text/html; charset=\" iso-8859-15=\"\">\n";
print "<meta http-equiv=\"content-language\" content=\"de\">\n";
print "<META Http-equiv=\"refresh\" Content=\"5; URL=/\">\n";
print "<link rel=\"shortcut icon\" href=\"/i-doit/favicon.ico\" type=\"image/x-icon\">\n";
print "<link rel=\"stylesheet\" type=\"text/css\" media=\"screen\" href=\"password.css\">\n";
print "\n";
print "<script type=\"text/javascript\">\n";
print "\n";
print "function live_clock()\n";
print " {\n";
print " var today = new Date();\n";
print " var second = today.getSeconds();\n";
print " var minute = today.getMinutes();\n";
print " var hour = today.getHours();\n";
print " var hour24 = today.getHours();\n";
print " var ampm = \"\";\n";
print " \n";
print " var day = today.getDay();\n";
print " var date = today.getDate();\n";
print " var month = today.getMonth();\n";
print " var year = today.getFullYear();\n";
print " \n";
print " var days = new Array();\n";
print " days[0] = \"Sunday\";\n";
print " days[1] = \"Monday\";\n";
print " days[2] = \"Tuesday\";\n";
print " days[3] = \"Wednesday\";\n";
print " days[4] = \"Thursday\";\n";
print " days[5] = \"Friday\";\n";
print " days[6] = \"Saturday\";\n";
print " \n";
print " var mns = new Array();\n";
print " mns[0] = \"January\";\n";
print " mns[1] = \"February\";\n";
print " mns[2] = \"March\";\n";
print " mns[3] = \"April\";\n";
print " mns[4] = \"May\";\n";
print " mns[5] = \"June\";\n";
print " mns[6] = \"July\";\n";
print " mns[7] = \"August\";\n";
print " mns[8] = \"September\";\n";
print " mns[9] = \"October\";\n";
print " mns[10] = \"November\";\n";
print " mns[11] = \"December\";\n";
print " \n";
print " if(second<10)\n";
print " {\n";
print " second = \"0\"+second;\n";
print " }\n";
print " if(minute<10)\n";
print " {\n";
print " minute = \"0\"+minute;\n";
print " }\n";
print " if(hour24<=12)\n";
print " {\n";
print " ampm = \"AM\";\n";
print " }\n";
print " else\n";
print " {\n";
print " ampm = \"PM\"\n";
print " }\n";
print " if(hour24>=12)\n";
print " {\n";
print " hour= hour-12;\n";
print " }\n";
print " if(hour24==0)\n";
print " {\n";
print " hour=12;\n";
print " }\n";
print "\n";
print "document.getElementById('live_clock').innerHTML=(hour+\":\"+minute+\":\"+second+\" \"+ampm+' '+days[day]+', '+date+' '+mns[month]+' '+year);\n";
print "}\n";
print "\n";
print "</script>\n";
print "\n";
print "</head>\n";
print "\n";
print "<body scroll=\"no\" onload=\"setInterval('live_clock()', 1000); fixScroll(); P7_fluidLayers('mydoitArea','5','73','215','auto',5,5,5,5); P7_fluidLayers('menuTreeOn','0','73','215','auto',5,5,5,5); P7_fluidLayers('menuTreeOff','0','73','5','auto',5,5,5,5); P7_fluidLayers('mainAreaNormal','226','73','auto','auto',5,5,5,0); P7_fluidLayers('mainAreaWide','8','73','auto','auto',5,5,5,0); onload_process();\">\n";
print "\n";
print "<div id=\"overlay\" style=\"display: none;\"></div>\n";
print "<div id=\"error\" class=\"login_error\" style=\"display: none;\"><div><span><strong>Notice</strong></span><span class=\"close\"><a onclick=\"new Effect.SwitchOff('error'); $('overlay').style.display='none';\" href=\"javascript:;\">X</a></span></div><p><span id=\"error_message\"></span></p></div>\n";
print "\n";
print "\n";
print "<form action=\"change_password.cgi\" method=\"post\" name=\"change_pass\" id=\"change_pass\" enctype=\"\">\n";
print "\n";
print "\n";
print "<!-- Clock -->\n";
print "<span id=\"live_clock\"></span>\n";
print "<!-- Clock end -->\n";
print "\n";
print "<!-- Breadcrumb navigation string begin -->\n";
print "<div id=\"breadCrumbNavi\">\n";
print " </div>\n";
print "<!-- Breadcrumb navigation string end -->\n";
print "\n";
print "<!--Banner -->\n";
print "<div id=\"banner\" style=\"overflow: hidden; height: 50px;\">\n";
print " <table border=\"0\" cellpadding=\"0\" cellspacing=\"0\" width=\"100%\">\n";
print " <tbody><tr>\n";
print " <td style=\"margin: 0px; padding: 0px;\" align=\"left\" height=\"50\" width=\"82\">\n";
print " <img src=\"change_password_files/oce_logo.gif\" border=\"0\">\n";
print " \n";
print " </td>\n";
print " <td style=\"margin: 0px; padding: 0px; overflow: hidden;\" align=\"right\" width=\"394\">\n";
print " </td>\n";
print " <td style=\"margin: 0px; padding: 0px; overflow: hidden;\" align=\"right\" height=\"50\" width=\"100%\">\n";
print " </td>\n";
print " <td style=\"margin: 0px; padding: 0px; overflow: hidden;\" align=\"right\" width=\"211\">\n";
print " </td>\n";
print " </tr>\n";
print " </tbody></table>\n";
print "</div>\n";
print "\n";
print "\n";
print "\n";
print "<div id=\"loginInnerArea\">\n";
print " \n";
print " <table id=\"loginInnerTable\" cellpadding=\"0\" cellspacing=\"0\">\n";
print " <tbody><tr>\n";
print " <td>\n";
print " <tr>\n";
print " <td align=\"center\"><br>Password successfully changed.<br></td>\n";
print " </tr>\n";
print " <tr>\n";
print " <td align=\"center\"><br>You will be redirected to Mission Control.<br><br></td>\n";
print " </tr>\n";
print " </td>\n";
print " </tr>\n";
print " </tbody></table>\n";
print " \n";
print "</div>\n";
print " </div>\n";
print " <!-- END: TOM GROUP: login| //--> </form>\n";
print "</body></html>\n";
}
sub header
{
print "Content-type: text/html\n\n";
print "<!DOCTYPE html PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n";
print "<html>\n";
print "<head>\n";
print "<meta content=\"text/html; charset=ISO-8859-1\" http-equiv=\"content-type\">\n";
print "<title>Change your password</title>\n";
print "</head>\n";
print "<body>\n";
}
sub footer
{
print "</body>\n";
print "</html>\n";
}
Die Variablen
müssen natürlich angepasst werden. Was fehlt? password.css.
#overlay {
position: absolute;
background: #000;
opacity: 0.4;
width: 100%;
text-align: center;
top: 0px;
z-index:10;
}
* html #overlay {
filter:alpha(opacity=40);
z-index:10;
}
#error {
position:absolute;
left:20%;
top:80px;
width:60%;
overflow:auto;
height:100px;
z-index:999;
}
#error span a {
color:#555;
font-weight:bold;
}
#error span.close {
position:absolute;
right:5px;
}
#error {
position:absolute;
left:20%;
top:80px;
width:60%;
overflow:auto;
height:100px;
z-index:999;
}
#error span a {
color:#555;
font-weight:bold;
}
#error span.close {
position:absolute;
right:5px;
}
#breadCrumbNavi {
font-weight:bold;
font-size:12px;
/**
* @todo NP: Der Workaround hier stinkt.
*/
white-space: nowrap;
}
.login_msg {
margin: 1px 5px 0 5px;
font-size:10px;
color: #000000;
}
.login_error {
text-align:left;
background-color:#ffdddd;
border:1px solid #ff4343;
color: #000000;
width:400px;
margin:30px auto;
z-index:999;
}
.login_error p {
margin:5px;
}
.login_error div {
background-color:#ffa1a1;
border-bottom:1px solid #ff4343;
padding:5px;
margin:0;
}
#banner {
border-bottom:1px solid #000;
/*background-image:url(/i-doit/images/banner/placeholder.png)*/
background-color:#C00000;
background-repeat:repeat-x;
}
#loginInnerArea {
position:absolute;
width:100%;
height:400px;
text-align:center;
top:180px;
}
#loginContent {
height:120px;
background-image:url("/i-doit/images/banner/logo.gif");
background-repeat:no-repeat;
background-position:10px;
margin:30px 15px;
text-align:right;
}
#loginContent #login_submit {
padding:5px 0;
}
.button, .buttonActive {
border:solid 1px #000000;
color:#04309d;
font-weight:bolder;
font-size:12px;
}
.button {
background-color:#E5E9FF;
}
.buttonActive {
background-color:#C1C0EC;
}
Das Stylesheet was ich verwende ist etwas anders, da ich noch mehr damit abdecke. Ich habe hier nur die im Passwort-Skript verwendenten Styles aufgelistet. Ggf. bitte korrigieren und mir ein Feedback schicken.
Martin Fürstenau <mf_at_maerber.de>