ホームページ  >  記事  >  バックエンド開発  >  Python の Tornado でユーザー ID 認証を実装する方法

Python の Tornado でユーザー ID 認証を実装する方法

不言
不言転載
2018-10-20 15:21:313764ブラウズ
この記事の内容は、Python での Tornado における本人認証の実装方法に関するもので、一定の参考価値がありますので、困っている方は参考にしていただければ幸いです。

Tornado の RequestHandler クラスには current_user 属性があり、現在のリクエストのユーザー名を保存するために使用されます。 RequestHandler.get_current_user のデフォルト値は None です。この属性は、get() や post() などの処理関数でいつでも読み取られて、現在のユーザー名を取得できます。 RequestHandler.current_user は読み取り専用プロパティであるため、プロパティ値を設定する場合は、RequestHandler.get_current_user() 関数をオーバーロードしてプロパティ値を設定する必要があります。

例: RequestHandler.current_user 属性と RequestHandler.get_current_user() メソッドを使用して、ユーザー ID 制御を実装します。

コード:

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()

この例は、完全な ID 認証プログラミング フレームワークを示しています。全体的な考え方は次のとおりです:

  • グローバル ディクショナリ dict_sessions を使用して、ログインしているユーザー情報を保存します。簡単にするために、この例では [返信 ID: ユーザー名] のキーと値のペアのみを保存します。

  • パブリック基本クラス BaseHandler を定義します。これは tornado.web.RequestHandler から継承し、この Web サイト上のすべてのプロセッサーのパブリック プロパティと動作を定義するために使用されます。 get_current_user() 関数をオーバーロードします。この関数は、RequestHandler.current_user プロパティにアクセスするときに Tornado によって自動的に呼び出されます。この関数は、まず get_secure_cookie() を使用してこの訪問のセッション ID を取得し、次にその ID を使用して dict_sessions からユーザー名を取得し、それを返します。

  • MainHandler クラスは、アクセスする前にユーザーの認証を必要とするハンドラー インスタンスです。このプロセッサの処理関数 get() は、デコレータ tornado.web.authenticated を使用します。実行前に、このデコレータを使用した処理関数は、current_user に値が割り当てられているかどうかに基づいて、ユーザーの認証ステータスを決定します。割り当てられている場合は、通常のロジックを実行します。それ以外の場合は、Web サイトのログイン ページに自動的にリダイレクトされます。

  • LoginHandler クラスはログイン ページ プロセッサであり、その get() 関数はログイン ページのレンダリングに使用され、post() 関数はユーザーにログイン ページの表示が許可されているかどうかを確認するために使用されます。ログイン。

  • tornado.web.Application の初期化関数では、Web サイトのログイン ページ アドレスが、login_url パラメーターを通じて指定されます。このアドレスは、ユーザーが認証されていないことが判明した場合に、tornado.web.authenticated デコレーターによって URL にリダイレクトするために使用されます。

注: ID 認証に参加するすべてのページ ハンドラーは、元の tornado.web.RequestHandler クラスを直接継承するのではなく、BaseHandler クラスから継承する必要があります。

商用 ID 認証には、パスワード検証メカニズムの追加、ログイン タイムアウトの管理、データベースへのユーザー情報の保存など、さらに多くのコンテンツを改善する必要があります。


以上がPython の Tornado でユーザー ID 認証を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。