使用flask-security SECURITY_TRACKABLE 获得实际IP地址

   使用Flask-Security时,如果SECURITY_TRACKABLE设置为True,将会在统计用户登录信息并记录到数据库,但是使用时需要主要一下两点设置:

  1. 确认User Model中是否有记录登录信息的字段
  2. 使用代理服务器,如nginx,需要在服务器端 代理设置

    首先确认User Model中是否有如下额外字段:

  • last_login_at:记录最后一次登录时间
  • current_login_at:记录当前登录时间
  •  last_login_ip:记录最后一次登录IP
  • current_login:记录当前登录IP
  • login_count:登录次数

示例如下:

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!


头部可信问题

请注意,在非代理情况下使用这个中间件是有安全问题的,因为它会盲目信任其他客户端(包括恶意客户端)发来的头部。

猜你喜欢

转载自blog.csdn.net/gh254172840/article/details/81302218