[bottle] Loginsystem

Django, Flask, Bottle, WSGI, CGI…
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Wie bau ich mir mit Bottle am besten ein Login-System?
Aus den kleinen Codeauszug bzgl Sessions in der FAQ von der Bottleseite werde ich nicht ganz schlau.
DAnke für eure Hilfe.
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Ahh hab gerade das Logging module gefunden:
http://docs.python.org/library/logging.html

werde es mir mal angucken.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

da waren dann wohl 2 G's zu viel im Begriff...
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Oh ja stimmt. Ich glaub ich geh erstmal nen Kaffee trinken *grrr

Aber welche Vorgehnsweise würdet ihr mir nun empfehlen?
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Ist jetzt keine direkte Lösung, aber nach den Problemen, die Du hier schon hattest, willst Du Dir evtl. doch mal flask angucken. Das bietet Dir ein eigenes Session-System und in der Doku ist das auch gut erklärt.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Du kannst auch einfach mit der session middleware arbeiten.

Da sollte auch ein Beispiel zu finden sein...


Edit: Ha, wer sagts denn: http://bottle.paws.de/page/faq
[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]
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

jbs hat geschrieben: Edit: Ha, wer sagts denn: http://bottle.paws.de/page/faq
Genau das hat der OP ja nicht verstanden ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

Mal wieder zu schnell gelesen :(


Zur FAQ:

Du brauchst eine Middleware, da bottle selber keine Session anbietet. Das heißt du schaltest was dazwischen, dass das kann. Es ändert sich aber das app Objekt, da es ja nun auch sessions verwalten soll. Diese app musst du bottle dann bekannt machen.

Wie man die Middleware nutzt, liest du dann hier nach: http://beaker.groovie.org/sessions.html
[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]
Benutzeravatar
noisefloor
User
Beiträge: 4179
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

was willst du den loggen?

BTW: wenn du auch "Aktionen" der Nutzer loggen willst, brauchst wohl zusätzlich zum Logging ein Log-In. :D

Gruß, noisefloor
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

was willst du den loggen?
Eigentlich nichts. Hab mich nur verschrieben *hehe*

Noch mal zum Thema: LOGIN ;):

Ich habe mir nun mal diese Middleware Beaker angeguckt bzw. auch eingespielt.
Und das Beispiel da auf der Seite verstehe ich auch fast außer:

Code: Alles auswählen

start_response('200 OK', [('Content-type', 'text/plain')])
???

Naja auf jeden Fall die Frage , die ich mir stelle ist:
Wie ich eine Session starte und fülle und abfrage (im .py), sollte soweit klar sein aber wie schütze ich denn meine generierten html Seiten?
Wenn ich z.B. eine Adminseite mache, muss ich doch vorher irgendwie abfragen können ob ne Session existiert oder nicht, damit er ggf. den Inhalt NICHT lädt.
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Niemand ne Idee wie man eine Login-Abfrage für den Adminbereich meines Gästebuches lösen kann?

Also nochmal zur Erkärung:

Ich habe eine Seite /admin wo Links generiert werden:

Lösche Beitrag X
Lösche Beitrag X
Lösche Beitrag X
Lösche Beitrag X
Lösche Beitrag X


So diese Links sollen dritte Person nicht sehen geschweige nicht ausführen.
D.h. er soll die Seite nur generieren wenn man sich eingeloggt hat.
Und ansonsten einfach wieder zur Startseite umlenken oder ne Error-Meldung ausgeben.


In PHP kann man oben im Html-Dokument bzw. php file abfragen , ob ne Session gestartet wurde oder nicht.
Benutzeravatar
noisefloor
User
Beiträge: 4179
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du kannst das über eine verschlüsselten Cookie lösen, in dem dann z.B. der Nutzername gespeichert wird in bei bestimmten Seiten geprüft wird, ob dieser Nutzer berechtigt ist, sie zu sehen.

Wenn die Anwendnungen auf einem Webserver läuft kannst du auch Auth-Basic Infos mit Bottle auswerten.

Gruß, noisefloor
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

du kannst das über eine verschlüsselten Cookie lösen, in dem dann z.B. der Nutzername gespeichert wird in bei bestimmten Seiten geprüft wird, ob dieser Nutzer berechtigt ist, sie zu sehen.
Ok und wie verschlüssel ich den richtig? Hab schon alles mögliche versucht aber er zeigt mir trotzdem immer problemlos den Wert an:

Code: Alles auswählen

@route('/test')
def test():
    response.set_cookie("mykey", "1234" secret=1)
    #return request.get_cookie("mykey")
    return request.get_cookie("mykey")
Sync32
User
Beiträge: 141
Registriert: Mittwoch 27. Januar 2010, 12:42

Ah, hab mein Fehler gefunden.
Habs falsch geschrieben.

Aber nun nochmal meine Frage:
Was bringt "secure=True" eigentlich? Da steht in den Cookieeinstellung nur "verschlüsselt". Aber mehr auch nicht.
Ich kann nach wie vor den Cookie_value einsehen.

Frage ist, was bringt der eigentlich?

Zweite Frage:
Wenn ich kein "expires" setze, verfällt der Cookie nach meiner Browsersitzung.
Ist das eine Defaulteinstellung und überall so?

Dritte_Frage:
Gibts ne Funktion, wo ich ein Cookie auf "Knopfdruck" löschen kann?
BlackJack

@Sync32: Wo kannst Du denn das verschlüsselte Cookie lesen? Ich denke es geht darum, dass der Besucher der Webseite es seinem Browser nicht lesen kann, denn sonst könnte er es ja bei sich einfach so ändern, dass er zum Beispiel Adminrechte in Deiner Webanwendung bekommt.
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?
Antworten