使用Flask-Security时,如果SECURITY_TRACKABLE设置为True,将会在统计用户登录信息并记录到数据库,但是使用时需要主要一下两点设置:
首先确认User Model中是否有如下额外字段:
示例如下:
class User(db.Model, UserMixin):
"""Represents Proected users."""
......
......
last_login_at = db.Column(db.DateTime)
current_login_at = db.Column(db.DateTime)
last_login_ip = db.Column(db.String(100))
current_login_ip = db.Column(db.String(100))
login_count = db.Column(db.Integer)
如果现在放到服务器,并使用代理,ip地址只能记录127.0.0.1,也就是WSGI被代理的地址,要获得用户的真是IP还需要设置服务器代理,这里以nginx为例:
server {
listen 80;
server_name _;
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
proxy_pass http://127.0.0.1:8000/;
proxy_redirect off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
如果你的 httpd 无法提供这些头部,那么最常用的设置是调用 X-Forwarded-Host
定义的主机和 X-Forwarded-For
定义的远程地址:
from werkzeug.contrib.fixers import ProxyFix
app.wsgi_app = ProxyFix(app.wsgi_app)
现在记录到数据库中的IP就是用户的真实IP地址了
Good Lucky!
头部可信问题
请注意,在非代理情况下使用这个中间件是有安全问题的,因为它会盲目信任其他客户端(包括恶意客户端)发来的头部。