7

私はこの投稿を見てきました: http://pythonhosted.org/Flask-Principal/#granular-resource-protection

現在の動作に問題はありませんが、ログイン時にすべての投稿が読み取らEditBlogPostNeedれ、ID に追加されるため、非常に使いやすいとは言えません。

ビューにアクセスするときに投稿をチェックしたいので、通常よりも多くの投稿を書いている場合、長期的にはあまり良い戦略ではないと想像してください/posts/<post_id>

を使用してビューの各リクエストでこのチェックを行う方法はありFlask Principalますか?

もちろん、遅延関係クエリとフィルターを使用して非常に簡単に回避できますが、Flask Principal.

4

4 に答える 4

1

あなたの質問を完全に理解しているかどうかはわかりませんが、これは役立つかもしれません。Flask アプリでは、管理者や編集者などのロール権限に Flask-Principal を使用しています。また、Flask-Principal docsで説明されているように、きめ細かなリソース保護にも使用しています。私の場合、ユーザーが特定のアカウントにアクセスする権限を持っているかどうかを確認しています。各ビューで ID が読み込まれ、権限がチェックされます。

ビューで:

@login_required
def call_list(id, page=1):

    dept = models.Department.query.get_or_404(id)
    view_permission = auth.ViewAccountPermission(dept.office.account_id)

    if view_permission.can():
        # do something

カスタム権限:

ViewAccount = namedtuple('View', ['method', 'value'])
ViewAccountNeed = partial(ViewAccount, 'view')

class ViewAccountPermission(Permission):
    def __init__(self, account_id):
        need = ViewAccountNeed(unicode(account_id))
        super(ViewAccountPermission, self).__init__(need)

ID ローダー関数では、次のようになります。

if hasattr(current_user, 'assigned_accounts'):
    for account_id in current_user.assigned_accounts():
        identity.provides.add(auth.ViewAccountNeed(unicode(account_id)))
于 2014-07-15T02:15:31.390 に答える
1

このトピックについて私が見つけることができるものはすべて、過度に鈍いようです。私が当初望んでいたものではありませんでしたが、ビュー関数でこれを手動で処理することにしました。これはより明示的であり、データベースに対する余分なクエリを減らします。私はまだすぐに使用flask-securityできるロールベースの認証を使用していることに注意してください (これはまだデコレータをflask-principal介して実装されています)。@roles_accepted('role')

@app.route('/my_accounts/', methods = ['GET'])
@app.route('/my_accounts/<int:id>/', methods = ['GET'])
@roles_accepted('client')
def my_accounts(id=None):

    if id:
        account = Account.query.get_or_404(id)

        if account.owner == current_user:
            return render_template("my_account.html",
                                   title = "Account: {0}".format(account.name),
                                   account = account)
        else:
            abort(403)

    accounts = Account.query.filter_by(owner=current_user).all()

    return render_template("my_accounts.html",
                           title = 'My Accounts',
                           accounts = accounts)
于 2018-09-13T22:53:28.343 に答える
0

私の答えは、flask プリンシパルがどのように機能するか、およびそれがデータベースとどのように統合されるかを既に知っているという前提に基づいています。

まず、ニーズをデータベースに保存するだけで済みます。理由がわからない場合は、以下の私の回答を読むことはお勧めしません

それでは、質問に戻りますが、記事を編集する必要があります。

@app.route('/article/edit/<id>'):
@Permission(Need('edit', 'article')).require()
def article(id):
    pass

ユーザーの身元

id = identity(user.id)
id.provide.add(Need('edit','article'))

次に、ユーザーは記事を編集する権限を持ちます。@Permission(Need('edit', 'article')).require()ユーザーが記事の作成者でなくても、すべての記事に対して true を返します。これはあなたの問題ですよね??

以下は、私がこの問題を解決する方法です

デフォルトの Permission.require() は に渡す引数を提供しないため、独自の Permisson と IdentityContext を定義し、記事 ID と記事モデルを渡します。次に、記事の user_id をフラスコ ログインの current_user.id でチェックします。

class MyPermission(Permission):
    pass


class MyIdentityContext():

    pass

ユーザーが記事の作成者である場合は True を返し、ユーザーは記事を編集できます。そうでない場合は False を返します。

--------詳細は後ほど更新します------------

于 2016-03-24T11:40:15.567 に答える