kuroの覚え書き

96の個人的覚え書き

ユーザー認証 Flask-Login

昨日いちにち本と首っ引きで作業したがやはりどこかおかしく、うまく動作しない。
今日はちょっとアプローチを変えてやってみよう。あと、作業を逐一記録しないとホントわけがわからなくなる。

Login-managerの登録をapp/__init__.pyに追記

login_manager = LoginManager()
login_manager.login_view =  "login"
login_manager.init_app(app)

ここでこの書式につてちょっと確認。__init__.pyの中でこれまで

from flask import Flask
app = Flask(__name__)

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

こういう書き方をしてきたのだが、もう一つ書き方があって

from flask import Flask
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
def create_app():
        app = Flask(__name__)
        db.init_app(app)
        return app

こういうのだね。最初に上げたlogin_managerの書式はどちらかと言うと2つ目の書き方(それも若干簡略化されている?)のようなので、自分のこれまでの書式に統一するなら

login_manager = LoginManager(app)
login_manager.login_view =  "login"

こういうのを__init__.pyに追加しておくべきなんだと思う。それにLoginManagerもimportしておかないとならないんじゃないかな。

from flask_login import LoginManager
login_manager = LoginManager(app)
login_manager.login_view =  "login"

これでlogin_manager.login_viewにログインページのviewを指定したことになるらしい。
つぎにユーザークラスの定義。app/models.pyのclass User(db.Model)に

    def is_authenticated(self):
        return True
    
    def is_active(self):
        return True

    def is_anonymous(self):
        return False

    def get_id(self):
        return self.username

を追加しておく。
これでanonymousではログインできないなどの基本ルールが与えられる。

と、ここまでは
https://www.osstech.co.jp/~hamano/posts/flask-login-ldap/
こちらのページを参考にしていたがここで解説されている方法はLDAPサーバを用いた認証で、SQLだとちょっと勝手が違う部分があるようだ。LDAPを使っても問題はないんだが、どうしたものか。SQLと冗長になるのはこの際気にせず、まずはLDAPでのユーザー認証で動作することを確認し、SQLに移行することを目指すといいだろうか。LDAPでユーザー管理すると、他のwebアプリ(redmineとか)とも一括管理ができるらしいので、案外いいのかもしれない。

ただ、どうやらFlask-LDAPがpython3に未対応なようで、pip3 installでエラーが出てインストールさせてもらえないみたい。
flask-ldap3-loginというパッケージは対応しているようだけど、これでいけるんだろうか?
https://pypi.python.org/pypi/flask-ldap3-login/0.9.1

ユーザー処理はややこしい上にセキュリティー上とても重要なので、あまり自己流であれやこれや悩むのは良くないだろう。
なので、例題のフルコピーをまずはやってみることだ。

  • メールによるユーザ確認

ユーザ登録でよく使われるパターンだな。メールアドレスを入力してsubmitするとそのアドレスにメールが届き、記載されたアドレスにアクセスすると登録が完了するというあれだ。