标签: flask-security

如何确保烧瓶管理面板具有烧瓶安全性

我希望使用Flask保护Web API并与之集成flask-admin以提供管理界面.我搜索并发现flask-admin有一个管理面板,/admin默认情况下任何人都可以访问它.它不提供身份验证系统并且完全打开(没有任何安全性),因为他们没有假设用于提供安全性的内容.此API必须在生产中使用,因此我们无法/admin为每个人访问网址提供开放路径.需要适当的身份验证.

views.py我不能简单地放置/admin路由并通过装饰器提供身份验证,因为这将覆盖已经创建的现有路由flask-admin,从而导致错误.

进一步的研究表明,有两个模块flask-adminflask-security.我知道flask-adminis_accessible保护它的方法,但它没有提供很多功能flask-security.

我没有找到任何方法来确保终点/admin加上所有其他终点,/admin例如/admin/<something>.

我正在寻找专门用flask-security来完成这项任务.如果不可能,请提出替代方案.

PS:我知道我可以锁定ngnix自己,但那将是最后一个选择.如果我可以拥有一个认证系统,flask-security那将是好事.

security authentication flask flask-security flask-admin

19
推荐指数
2
解决办法
1万
查看次数

将Flask-Security角色与Flask-JWT REST API一起使用

我正在构建基于Flask的REST API并使用Flask-JWT来处理JWT身份验证.我还想使用Flask-Security的内置角色管理.但是,Flask-Security的@roles_required()装饰器假设我在失败时显示Flask视图.

这是我的令牌端点(它正在按我的意愿工作):

$ http POST localhost:5000/auth/token username='test' password='test'
HTTP/1.0 200 OK
Content-Length: 192
Content-Type: application/json
Date: Sun, 08 Nov 2015 17:45:46 GMT
Server: Werkzeug/0.10.4 Python/3.5.0

{
    "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE0NDcwMDQ3NDYsIm5iZiI6MTQ0NzAwNDc0NiwiZXhwIjoxNDQ3MDA1MDQ2LCJpZGVudGl0eSI6MX0.RFIeaLuvJNM9fDjFYFQ7sh_WaDVU-_aM7e46tVJzlBQ"
}
Run Code Online (Sandbox Code Playgroud)

以下是对没有任何角色要求的资源的成功响应(仅使用@jwt_required)这也是我想要的:

$http GET localhost:5000/protected Authorization:'JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE0NDcwMDQ3NDYsIm5iZiI6MTQ0NzAwNDc0NiwiZXhwIjoxNDQ3MDA1MDQ2LCJpZGVudGl0eSI6MX0.RFIeaLuvJNM9fDjFYFQ7sh_WaDVU-_aM7e46tVJzlBQ'
HTTP/1.0 200 OK
Content-Length: 25
Content-Type: text/html; charset=utf-8
Date: Sun, 08 Nov 2015 17:46:24 GMT
Server: Werkzeug/0.10.4 Python/3.5.0

<models.User[email=test]>
Run Code Online (Sandbox Code Playgroud)

当我对具有所需角色的资源(例如本例中的admin)执行相同操作时,似乎假设我有一个要显示的页面,例如/ login,我没有,因为它是无头REST API:

$ http GET localhost:5000/admin Authorization:'JWT eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE0NDcwMDQ3NDYsIm5iZiI6MTQ0NzAwNDc0NiwiZXhwIjoxNDQ3MDA1MDQ2LCJpZGVudGl0eSI6MX0.RFIeaLuvJNM9fDjFYFQ7sh_WaDVU-_aM7e46tVJzlBQ'
HTTP/1.0 302 FOUND
Content-Length: 209
Content-Type: text/html; charset=utf-8
Date: Sun, 08 Nov 2015 17:46:43 GMT
Location: …
Run Code Online (Sandbox Code Playgroud)

rest flask-security flask-principal flask-jwt

19
推荐指数
1
解决办法
2113
查看次数

如何使用Flask-Security寄存器视图?

有人使用Flask-Security扩展进行身份验证吗?如何使注册视图起作用?

http://packages.python.org/Flask-Security/customizing.html

我指的是上面的链接.

 @app.route('/register', methods=['GET'])
 def register():
     return render_template('security/register_user.html')
Run Code Online (Sandbox Code Playgroud)

我不想扩展默认类,我只想在我的站点布局中包装默认注册视图,所以我这样做了.

{% extends "layout.html" %}
{% block title %}upload{% endblock %}
{% block body %}

{% from "security/_macros.html" import render_field_with_errors, render_field %}
{% include "security/_messages.html" %}
<h1>Register</h1>
<form action="{{ url_for_security('register') }}" method="POST" name="register_user_form">
{{ register_user_form.hidden_tag() }}
{{ render_field_with_errors(register_user_form.email) }}
{{ render_field_with_errors(register_user_form.password) }}
{% if register_user_form.password_confirm %}
   {{ render_field_with_errors(register_user_form.password_confirm) }}
{% endif %}
{{ render_field(register_user_form.submit) }}
</form>
{% include "security/_menu.html" %}

{% endblock %}
Run Code Online (Sandbox Code Playgroud)

我收到以下错误?

werkzeug.routing.BuildError
BuildError: ('security.register', {}, None)
Run Code Online (Sandbox Code Playgroud)

python flask flask-extensions flask-security

16
推荐指数
2
解决办法
1万
查看次数

测试Flask登录和身份验证?

我正在开发Flask应用程序并使用Flask-security进行用户身份验证(后面又使用Flask-login).

我有一条需要认证的路线/user.我正在尝试编写一个单元测试来测试,对于经过身份验证的用户,这会返回相应的响应.

在我的unittest中,我正在创建一个用户并以该用户身份登录:

from unittest import TestCase
from app import app, db
from models import User
from flask_security.utils import login_user

class UserTest(TestCase):
   def setUp(self):
       self.app = app
       self.client = self.app.test_client()
       self._ctx = self.app.test_request_context()
       self._ctx.push()

       db.create_all()

   def tearDown(self):
       if self._ctx is not None:
           self._ctx.pop()

       db.session.remove()
       db.drop_all()

   def test_user_authentication():
       # (the test case is within a test request context)
       user = User(active=True)
       db.session.add(user)
       db.session.commit()
       login_user(user)

       # current_user here is the user
       print(current_user)

       # current_user within this request is an anonymous …
Run Code Online (Sandbox Code Playgroud)

python unit-testing flask flask-login flask-security

15
推荐指数
3
解决办法
2万
查看次数

使用flask-security扩展的基于令牌的身份验证

我目前正在寻找一种使用基于令牌的身份验证来保护REST API的方法.我正在使用Flask在Python中开发API,并发现了flask-security扩展,它似乎有很多有趣的功能.

令牌中提到的功能之一是令牌认证.

根据文件:

通过执行HTTP POST检索用户身份验证令牌来启用基于令牌的身份验证,其中身份验证详细信息为针对身份验证端点的JSON数据.成功调用此端点将返回用户的ID及其身份验证令牌.此令牌可用于对受保护资源的后续请求.

但是,我仍然对如何使用flask-security实现此功能感到困惑.一些在线研究让我使用了诸如@auth_token_required之类的东西,但我把所有东西放在一起都有些麻烦.烧瓶安全文档本身并不是很有帮助.

例如,用户如何获得身份验证令牌?什么是身份验证端点?

如果你能引导我朝着正确的方向前进,那就太棒了.代码示例也很棒:-)

restful-authentication flask python-3.x flask-security

13
推荐指数
3
解决办法
7473
查看次数

使用angularjs和flask进行用户身份验证的正确方法

我正在用烧瓶进行Web开发.我想在前端构建一个带有烧瓶的webapp作为后端和angular.js.Json部分是直截了当的,我的第一步很好.但现在我陷入了用户身份验证.我读了很多,但发现WTFForms的工作效果不如角度(没有CSFR令牌),所以我不能使用像flask-security这样的东西.

使用Angular和Flask实现用户身份验证的正确方法或最佳实践是什么?(也许有人知道一个很好的示例应用程序,我可以通过示例学习)

python authentication flask angularjs flask-security

12
推荐指数
1
解决办法
1万
查看次数

Flask-Security user_registered信号在Python 3.3中未收到,但在2.7中有效

我正在尝试使用user_registered信号,以便在用户使用flask-security注册时为用户设置默认角色,如以下链接所示:在Flask Security中设置默认角色

在我的搜索中,我可以看到在烧瓶安全性中已经解决了这个问题:没有从烧瓶安全性,Fix - user_registered信号问题获得信号

我已尝试以下方法来证明处理程序是否收到信号而没有任何运气:

@user_registered.connect_via(app)
def user_registered_sighandler(sender, **extra):
    print("print-user_registered_sighandler:", extra)
Run Code Online (Sandbox Code Playgroud)

然而,即使用户注册并且应该发送信号,也不会被调用.

如果它有助于我设置flask-security配置如下:

app.config['SECURITY_REGISTERABLE'] = True
app.config['SECURITY_CONFIRMABLE'] = False
app.config['SECURITY_SEND_REGISTER_EMAIL'] = False
app.config['SECURITY_CHANGEABLE'] = True
app.config['SECURITY_SEND_PASSWORD_CHANGE_EMAIL'] = False
Run Code Online (Sandbox Code Playgroud)

来自Flask-Login和Flask-Principal的信号正在为我工​​作,因为我设法确认以下代码片段在发送信号时成功打印:

@user_logged_out.connect_via(app)
def on_user_logged_out(sender, user):
    print('USER LOG OUT: made it in',user)

@identity_changed.connect_via(app)
def identity_changed_ok(sender,identity):
    print('Identity changed:',identity)
Run Code Online (Sandbox Code Playgroud)

对于我的设置,我使用python 3.3(anaconda)并使用以下内容:Flask == 0.10.1,flask-login == 0.2.11,flask-principal == 0.4.0,flask-security == 1.7.4,信号灯== 1.3.看了瓶子登录和烧瓶安全的信号,我不知道为什么烧瓶安全信号不起作用.

编辑:

如果我print(user_registered.receivers)在我的应用程序中添加路线,它将显示我有一个接收器:{139923381372400: <function user_registered_sighandler at 0x7f42737145f0>}.如果我把这个相同的print语句放在flask-security的registerable.py之前,user_registered.send(app._get_current_object(),user=user, confirm_token=token)那么它就没有列出接收器:{}

EDIT2:

问题似乎与使用python 3.3有关.我创建了一个python 2.7环境,user_registered代码按预期工作.

完整代码重现:

from …
Run Code Online (Sandbox Code Playgroud)

python flask flask-security blinker

12
推荐指数
1
解决办法
981
查看次数

Flask-Security CSRF令牌

我有一个烧瓶应用程序作为REST API后端.我想为后端实现基于令牌的身份验证,但为了做到这一点,我需要检索用户令牌.Flask-Security文档明确指出,要检索令牌,需要执行HTTP POST,并将身份验证详细信息作为JSON数据发送到身份验证端点.不幸的是,我不明白如何检索执行此类请求所需的CSRF令牌.

如果我使用扩展提供的登录页面/模板,CSRF令牌将在窗体的隐藏字段中传递给客户端.问题是:

如何在不访问和解析登录页面的情况下检索CSRF令牌,例如使用$ http方法或移动应用程序的angularJS应用程序?

显然我可以避免使用Flask-Security并自己实现这些部分,但我对webapps相对缺乏经验,我觉得我可能会以错误的方式接近它.

flask angularjs flask-security

11
推荐指数
2
解决办法
6969
查看次数

如何在Flask中实现令牌认证?

我正在尝试允许用户使用来自单独Web服务的帐户登录我的Flask应用程序.我可以联系此Web服务的api并获得安全令牌.如何使用此令牌对用户进行身份验证,以便他们可以访问受限制的视图?

我不需要将用户保存到我自己的数据库中.我只想为会话验证它们.我相信这可以使用Flask-Security和@auth_token_required装饰器完成,但文档不是很详细,我不知道如何实现它.

编辑:

这是一个代码示例:

@main.route("/login", methods=["GET", "POST"])
def login():

    payload = {"User": "john", "Password": "password123"}
    url = "http://webserviceexample/api/login"
    headers = {'content-type': 'application/json'})

    #login to web service
    r = requests.post(url, headers=headers, json=payload)
    response = r.json()

    if (r.status_code is 200):
        token = response['user']['authentication_token']

        # allow user into protected view

    return render_template("login.html", form=form)


@main.route('/protected')
@auth_token_required
def protected():
    return render_template('protected.html')
Run Code Online (Sandbox Code Playgroud)

python authentication flask flask-security http-token-authentication

11
推荐指数
1
解决办法
2万
查看次数

结合Flask-restless,Flask-security和常规Python请求

我的目标是为我的Web应用程序提供REST API.使用:

  • Python 2.7.5
  • 瓶== 0.10.1
  • 烧瓶不宁== 0.13.1
  • 烧瓶安全== 1.7.3

我需要保护对Web和REST访问的数据的访问.但是,request在尝试连接到安全API时,我无法获得任何常规python 成功.

使用本问题末尾提供的全功能模块获得以下输出.

我设法在使用时得到正确的答案http://127.0.0.1:5000/api/v1/free_stuff:

>>> import requests
>>> r=requests.get('http://127.0.0.1:5000/api/v1/free_stuff')
>>> print 'status:', r.status_code
status: 200  # all is fine
Run Code Online (Sandbox Code Playgroud)

尝试使用身份验证时http://127.0.0.1:5000/api/v1/protected_stuff:

>>> from requests.auth import HTTPBasicAuth, HTTPDigestAuth
>>> r=requests.get('http://127.0.0.1:5000/api/v1/protected_stuff', 
                   auth=HTTPBasicAuth('test', 'test')) #  the same with ``HTTPDigestAuth``
>>> print 'status:', r.status_code
status: 401
>>> r.json()  # failed!
{u'message': u'401: Unauthorized'}
Run Code Online (Sandbox Code Playgroud)

这是一个用于产生上述结果的虚拟功能模块:

from flask import Flask, render_template, url_for, redirect
from flask.ext.sqlalchemy import SQLAlchemy
from flask.ext.security import Security, …
Run Code Online (Sandbox Code Playgroud)

python restful-authentication flask flask-security flask-restless

10
推荐指数
1
解决办法
7980
查看次数