Seite 1 von 2

Re: [bottle] Loginsystem

Verfasst: Donnerstag 12. August 2010, 17:37
von jbs
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)

Re: [bottle] Loginsystem

Verfasst: Freitag 13. August 2010, 09:27
von Sync32
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

Re: [bottle] Loginsystem

Verfasst: Freitag 13. August 2010, 09:35
von 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.

Re: [bottle] Loginsystem

Verfasst: Freitag 13. August 2010, 09:49
von Sync32
auch den Schlüssel zum entschlüsseln
Wie meinst du das jetzt genau?

Re: [bottle] Loginsystem

Verfasst: Freitag 13. August 2010, 10:15
von 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?

Re: [bottle] Loginsystem

Verfasst: Freitag 13. August 2010, 10:23
von Sync32
response.set_cookie('mycookie', '12345', secure=True, expires=+500)

Re: [bottle] Loginsystem

Verfasst: Freitag 13. August 2010, 10:33
von 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.

Re: [bottle] Loginsystem

Verfasst: Freitag 13. August 2010, 11:17
von Sync32
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

Re: [bottle] Loginsystem

Verfasst: Samstag 14. August 2010, 08:34
von snafu
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ß. ;)

Re: [bottle] Loginsystem

Verfasst: Samstag 14. August 2010, 11:20
von jbs
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),))