1. 程式人生 > >flask-login模塊

flask-login模塊

eth 定義 篡改 dir ces ade code where info

flask-login為flask提供了用戶會話管理。他處理了日常的登入,登出並且長時間記住用戶的會話。

1.在會話中存儲當前活躍的用戶ID,讓你能夠自由地登入和登出。

2.讓你限制登入或登出用戶可以訪問的視圖。

3.處理讓人棘手的記住我功能。

4.幫助你保護用戶會話免遭cookie被盜的牽連。

5.可以與以後可能使用的flask-principal或其他認證擴展集成。

一、配置你的應用

對一個使用flask-login的應用最重要的一部分是loginmanager類。

login_manager = LoginManager()
login_manager.init_app(app)

二、他是如何工作的

必須提供一個user_loader回調。

@login_manager.user_loader
def load_user(userid):
    return User.get(userid)

接受一個用戶的unicodeID作為參數,並且返回響應的用戶對象。

如果ID無效的話,他應該返回none。

三、你的用戶類

你用來標識用戶的類需要實現這些屬性和方法:

四個方法:

is_authenticated、is_active、is_anonymous、get_id

is_authenticated 當用戶通過驗證時,也即提供有效證明是返回true。

is_active 可以直接返回true。

is_anonymous 如果是匿名用戶,返回true。真實用戶返回False。

get_id 返回一個能唯一識別用戶的,並能用於user_loader回調中加載用戶的Unicode ID。

要簡便的實現用戶類,可以從UserMixin繼承,他提供了對所有這些方法的默認實現。

四、login示例

一旦用戶通過驗證,使用login_user函數讓用戶登錄。

@app.route(/login,methods=[GET,POST])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        login_user(user)
        flask.flash(
Logged in successfully.) next = flask.request.args.get(next) if not next_is_valid(next): return flask.abort(400) return flask.redirct(next or flask.url_for(index)) return flask.render_template(login.html, form=form)

這裏必須驗證next參數,如果不驗證,你的應用會收到重定向攻擊。

需要用戶登入的視圖可以用login_required裝飾器來裝飾。

@app.route(/settings)
@login_required
def settings():
    pass

當用戶需要登出時,使用logout_user方法。

@app.route(/logout)
@login_required
def logout():
    logout_user()
    return redirect(somewhere)

他們會被登出,且他們會話產生的任何cookie都會被清理幹凈。

五、定制登入過程

默認情況下,當未登錄的用戶嘗試訪問一個login_required裝飾的視圖,flask-login會閃現

一條消息並且重定向到登錄視圖。

如果未設置登錄視圖,他將會以401錯誤退出。

登錄視圖的名稱可以設置成LoginManager.login_view。

login_manager.login_view = users.login

默認的閃現消息是Please log in to access this page.

要自定義該信息,請設置login_message。

login_manager.login_message = uplease log in

要自定義消息分類,請設置login_message_category。

login_manager.login_message_category = info

當重定向到登入視圖,他的請求字符串中會有一個next變量,其值為用戶之前訪問的頁面。

六、使用request loader定制登錄

有時你想要不使用cookies情況下登錄用戶,比如使用http頭或者一個作為查詢參數的api密鑰。

這種情況下應該是用request_loader回調。

七、匿名用戶

默認情況下,當一個用戶沒有真正的登錄,current_user被設置成一個AnonymousUserMixin對象。

is_active is_authenticated的值為False

is_anonymous的值為true

get_id返回None

八、記住我

記住我的功能很難實現。但是flask-login幾乎透明的實現它。

只要把remember=True傳遞給login_user。

一個cookie將會存儲在用戶計算機中,如果用戶會話中沒有用戶ID的話,flask-login會自動地從cookie中恢復用戶ID。

這裏cookie是防篡改的。

該層功能是被自動實現的。

九、會話保護

當上述特性保護記住我令牌免遭cookie竊取時,會話cookie依然是脆弱的。

session_protection的值為basic或者strong。禁用時應設置為None。

默認時被激活為basic模式。

這裏需要知道字符串或者數字如何轉換為Unicode。非常重要。

計劃在下一篇博客中討論。

flask-login模塊