Heim > Artikel > Backend-Entwicklung > So implementieren Sie die Benutzeridentitätsauthentifizierung unter Tornado in Python
In der RequestHandler-Klasse von Tornado gibt es ein current_user-Attribut, um den Benutzernamen der aktuellen Anfrage zu speichern. Der Standardwert von RequestHandler.get_current_user ist None. Dieses Attribut kann jederzeit in Verarbeitungsfunktionen wie get() und post() gelesen werden, um den aktuellen Benutzernamen zu erhalten. RequestHandler.current_user ist eine schreibgeschützte Eigenschaft. Wenn Sie also den Eigenschaftswert festlegen möchten, müssen Sie die Funktion RequestHandler.get_current_user() überladen, um den Eigenschaftswert festzulegen.
Beispiel: Verwenden Sie das Attribut RequestHandler.current_user und die Methode RequestHandler.get_current_user(), um die Benutzeridentitätskontrolle zu implementieren.
Code:
import tornado.web import tornado.ioloop import uuid #UUID 生成库 dict_sessions={} #保存所有登录的Session class BaseHandler(tornado.web.RequestHandler): #公共基类 #写入current_user的函数 def get_current_user(self): session_id=self.get_secure_cookie("session_id") return dict_sessions.get(session_id) class MainHandler(BaseHandler): @tornado.web.authenticated #需要身份认证才能访问的处理器 def get(self): name=tornado.escape.xhtml_escape(self.current_user) self.write("Hello,"+name) class LoginHandler(BaseHandler): def get(self): #登陆页面 self.write('<html><>body' '<form action="/login" method="post">' 'Name:<input type="text" name="name">' '<input type="submit" value="Sign in">' '</form></body></html>') def post(self): #验证是否运行登陆 if len(self.get_argument("name"))<3: self.redirect("/login") session_id=str(uuid.uuid1()) dict_sessions[session_id]=self.get_argument("name") self.set_secure_cookie("session_id",session_id) self.redirect("/") setting={ "cookie_secret":"SECRET_DONT_LEAK", #Cookie加密秘钥 "login_url":"/login" #定义登陆页面 } application=tornado.web.Application([ (r"/",MainHandler), #URL映射定义 (r"/login",LoginHandler) ],**setting) def main(): application.listen(8888) tornado.ioloop.IOLoop.current().start() #挂起监听 if __name__ == '__main__': main()
Dieses Beispiel zeigt ein vollständiges Programmierframework für die Identitätsauthentifizierung. Die Gesamtidee ist wie folgt:
Verwenden Sie das globale Wörterbuch dict_sessions Speichern Sie die Informationen des angemeldeten Benutzers. Der Einfachheit halber speichert dieses Beispiel nur das Schlüssel-Wert-Paar von [Antwort-ID: Benutzername].
Definieren Sie die öffentliche Basisklasse BaseHandler, die von tornado.web.RequestHandler erbt und zum Definieren der öffentlichen Eigenschaften und Verhaltensweisen aller Prozessoren auf dieser Website verwendet wird. Überladen Sie die Funktion get_current_user(), die von Tornado automatisch aufgerufen wird, wenn auf die Eigenschaft RequestHandler.current_user zugegriffen wird. Diese Funktion verwendet zunächst get_secure_cookie(), um die Sitzungs-ID dieses Besuchs abzurufen, und verwendet dann die ID, um den Benutzernamen von dict_sessions abzurufen und ihn zurückzugeben.
Die MainHandler-Klasse ist eine Handler-Instanz, für deren Zugriff eine Benutzerauthentifizierung erforderlich ist. Die Verarbeitungsfunktion get() in diesem Prozessor verwendet den Dekorator tornado.web.authenticated. Vor der Ausführung ermittelt die Verarbeitungsfunktion mit diesem Dekorator den Authentifizierungsstatus des Benutzers basierend darauf, ob current_user ein Wert zugewiesen wurde Führen Sie die normale Logik aus, andernfalls werden Sie automatisch zur Anmeldeseite der Website weitergeleitet.
Die LoginHandler-Klasse ist ein Anmeldeseitenprozessor. Ihre get()-Funktion wird zum Rendern der Anmeldeseite verwendet, und ihre post()-Funktion wird verwendet, um zu überprüfen, ob der Benutzer dazu berechtigt ist einloggen.
Geben Sie die Anmeldeseitenadresse der Website über den Parameter login_url in der Initialisierungsfunktion von tornado.web.Application an. Diese Adresse wird vom Dekorator tornado.web.authenticated verwendet, um zu einer URL umzuleiten, wenn festgestellt wird, dass der Benutzer nicht authentifiziert wurde.
Hinweis: Alle Seitenhandler, die an der Identitätsauthentifizierung teilnehmen, müssen von der BaseHandler-Klasse erben, anstatt direkt die ursprüngliche tornado.web.RequestHandler-Klasse zu erben.
Die kommerzielle Identitätsauthentifizierung muss weitere Inhalte verbessern, z. B. das Hinzufügen eines Mechanismus zur Passwortüberprüfung, die Verwaltung des Anmelde-Timeouts, das Speichern von Benutzerinformationen in der Datenbank usw.
Das obige ist der detaillierte Inhalt vonSo implementieren Sie die Benutzeridentitätsauthentifizierung unter Tornado in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!