flask-login模塊
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 = u‘please 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模塊