Hi Antville developers,
ich habe für unsere Antville installation Shibboleth Single-Sign-On in
Antville integriert. Es waren ziemlich wenig Änderungen dazu nötig:
Die Hauptaufgabe des Logins übernimmt mod_shib, der anonymous Anfragen
an geschützte Verzeichnisse (im Fall von antville ist es /members)
abfängt, den User zum SSO Identity Provider weiterleitet und
anschließend die Berechtigung von diesem empfängt. Ist der User
angemeldet, injiziert mod_shib (in unserem Fall) die Header "uid" und
"mail", wenn die beiden gesetzt sind, ist der Benutzer eingeloggt:
User/User.js:186
User.autoLogin = function() {
//if (session.user) {
// return;
//}
var u;
var name=req.getHeader('uid');
if(name && name.length>0) {
u = root.users.get(name);
if(!u) {
u = app.registerUser(name, ("foo"+(Math.random()*10000)).md5
() );
if (!u) throw new Exception("memberExisting");
u.email = req.getHeader('mail');
u.publishemail = false;
u.registered = new Date();
u.blocked = 0;
u.status = User.REGULAR;
}
session.login(u);
u.touch();
//u.lastVist=new Date();
res.message = gettext('Welcome to "{0}", {1}. Have fun!',
res.handlers.site.title,
u.name);
return;
}
//var name = req.cookies[User.COOKIE];
//var hash = req.cookies[User.HASHCOOKIE];
//if (!name || !hash) {
// return;
//}
//var user = User.getByName(name);
//if (!user) {
// return;
//}
//var ip = req.data.http_remotehost.clip(getProperty("cookieLevel",
"4"),
// "", "\\.");
//if ((user.hash + ip).md5() !== hash) {
// return;
//}
//session.login(user);
//user.touch();
//res.message = gettext('Welcome to "{0}", {1}. Have fun!',
// res.handlers.site.title,
user.name);
//return;
}
Ich musste beim aufruf des Login-Formulars von antville noch abfangen,
ob der Benutzer bereits eingeloggt ist und ihn dann dementsprechend
weiterleiten. Diese änderung sollte nicht mit dem normalen Login-
verhalten kollidieren.
Members/Members.js:153
Members.prototype.login_action = function() {
if(session) {
res.redirect(User.getLocation() || this._parent.href());
}
if (req.postParams.login) {
try {
var user = User.login(req.postParams);
res.message = gettext('Welcome to "{0}", {1}. Have fun!',
res.handlers.site.getTitle(),
user.name);
res.redirect(User.getLocation() || this._parent.href());
} catch (ex) {
res.message = ex;
}
}
session.data.token = User.getSalt();
res.data.action = this.href(req.action);
res.data.title = gettext("Login to {0}", this._parent.title);
res.data.body = this.renderSkinAsString("$Members#login");
this._parent.renderSkin("Site#page");
return;
}
Beim Logout logge ich den Benutzer aus und leite ihn an Shibboleth
Logout weiter
Members/Members.js:175
Members.prototype.logout_action = function() {
if (session.user) {
res.message = gettext("Good bye, {0}! Lookin' forward to seeing
you again!",
session.user.name);
User.logout();
res.redirect("
https://mein-server/Shibboleth.sso/Logout");
}
res.redirect(this._parent.href());
return;
}
Da die Änderungen "so einfach" waren sollten sie sich relativ einfach
in Antville integrieren lassen, sodass Antville von Haus aus
Shibboleth-Unterstützung mitbringen kann. Was haltet ihr davon?
Gruß, Nils