[bottle] Loginsystem

Django, Flask, Bottle, WSGI, CGI…
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Warum machst du das nicht in etwa so?

Code: Alles auswählen

users = dict(name='foo', level=1), dict(name='admin', level=0)



import bottle
from bottle import route, run, get

s = lambda: bottle.request.environ.get('beaker.session')

@get('/make-me-admin')
def make_me_admin():
    s()['id'] = 1
    s().save()
    return 'Now you are an admin!'

@get('/secret')
def secret():
    id = s().get('id', -1)
    print id
    if id >= 0 and users[id]['level'] == 0:
        return 'Hello Admin'
    return 'Not allowed!!!' 
    

from beaker.middleware import SessionMiddleware

app = bottle.default_app()
session_opts = {
    'session.type': 'file',
    'session.cookie_expires': 300,
    'session.data_dir': './data',
    'session.auto': True
}
app = SessionMiddleware(app, session_opts)


run(app=app, reloader=True)
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Danke für dein Beispiel.
Hab aber nun auch eine gute Lösung gefunden mit den Cookies.
Hab nur ein Problem:

Wenn ich den Cookie, wie mir empfohlen, verschlüsselt (secure = true) setze, ist er zwar verschlüsselt aber denn kann ich ihn anschließend selber nicht mehr mit
request.get_cookie("mycookie")
auslesen??? Was ich ja muss
BlackJack

@Sync32: Ist die Frage ernst gemeint!? Natürlich müsstest Du beim Auslesen dann auch den Schlüssel zum entschlüsseln angeben. Wenn das ohne ginge, könnte das ja jeder machen.
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

auch den Schlüssel zum entschlüsseln
Wie meinst du das jetzt genau?
BlackJack

@Sync32: Schau Dir mal die Dokumentation von `set_cookie()` und `get_cookie()` an und welche Argumente man da übergeben kann. Wie hast Du denn `set_cookie()` aufgerufen?
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

response.set_cookie('mycookie', '12345', secure=True, expires=+500)
BlackJack

@Sync32: Dann sehe ich jetzt das Problem gerade so überhaupt nicht, denn Du verschlüsselst den Cookie nicht, musst ihn also auch nicht entschlüsseln. Das `secure` wirkt sich (vielleicht!) auf die Übertragung aus, aber das passiert transparent.

Es kann sein, dass der Browser Dein Cookie nicht akzeptiert, weil das `expires` in einem falschen Format ist. Laut den Beispielen bei Wikipedia ist das ein Datum.
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

denn Du verschlüsselst den Cookie nicht
Ops! Wie verschlüssel ich den denn?

Also wenn ich secure=True benutze, findet er den Cookie bei der Abfrage nicht mehr.
Wenn ich es weglasse (secure=True), dann funktioniert und findet er alles wunderbar
Benutzeravatar
snafu
User
Beiträge: 6980
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hm, Bottles Philosophie, dem User alle Möglichkeiten offen zu lassen, was Middleware angeht, in Ehren, aber vielleicht macht es schon Sinn, zumindest für so triviale Aktionen wie `bottle.request.environ.get('beaker.session')` einen Alias als Funktion bereitzustellen. So wie ja auch Server-Adapter eingebaut sind, die frei wählbar sind, aber eben erst unter Nutzung ihrer Abhängigkeit anwendbar sind, um wirklich sinnvolles Arbeiten zu ermöglichen. Das macht den Code IMHO eine ganze Ecke schöner und ich denke nicht, dass ein Einsatz in Maßen dem schlanken Charakter des Projekts schaden würde.

Wobei, gut, dann müsste man `SessionMiddleware()` mit sinnvollen Voreinstellungen wohl auch wrappen. Man könnte hier vielleicht quasi auf höchster Ebene `bottle.run()` ein Flag für `beaker_session` oder sowas mitgeben. Nur muss man da sicher aufpassen, dass es nicht zu magisch wird. Naja, trotzdem mal als Denkanstoß. ;)
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

snafu hat geschrieben:Hm, Bottles Philosophie, dem User alle Möglichkeiten offen zu lassen, was Middleware angeht, in Ehren, aber vielleicht macht es schon Sinn, zumindest für so triviale Aktionen wie `bottle.request.environ.get('beaker.session')` einen Alias als Funktion bereitzustellen. So wie ja auch Server-Adapter eingebaut sind, die frei wählbar sind, aber eben erst unter Nutzung ihrer Abhängigkeit anwendbar sind, um wirklich sinnvolles Arbeiten zu ermöglichen. Das macht den Code IMHO eine ganze Ecke schöner und ich denke nicht, dass ein Einsatz in Maßen dem schlanken Charakter des Projekts schaden würde.

Wobei, gut, dann müsste man `SessionMiddleware()` mit sinnvollen Voreinstellungen wohl auch wrappen. Man könnte hier vielleicht quasi auf höchster Ebene `bottle.run()` ein Flag für `beaker_session` oder sowas mitgeben. Nur muss man da sicher aufpassen, dass es nicht zu magisch wird. Naja, trotzdem mal als Denkanstoß. ;)

Ich dachte man könnte sowas in ein ext Modul auslagern und dann in etwa folgendes machen:

Code: Alles auswählen

from bottle.ext.session import SessionMiddleware, session
...
@get('/foo')
def foo():
    s = bottle.request.session
    #oder
    s = session()

#oder
@get('/foo')
@session
def foo(s):
    ...
run(app_wrappers=(partial(SessionMiddleware, config=session_opts),))
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Antworten