4

私は bottle.py を repoze.who で動作させようとしていますが、これまでのところ、私が見つけたさまざまな例の組み合わせを使用して、次の非常に単純なプログラムをまとめて動作させることができました。明らかに、これは本番環境で実行するものではありません。これを使用する方法を学ぶことができるように、できるだけ複雑でないコードを作成しようとしていますが、残念ながら、repoze.who で bottle.py を使用するためのチュートリアルは非常に少ないです。

以下の例は機能し、誰かが admin/admin のユーザー名/パスワードでログインできるようにします。logout() 関数を機能させるには、repoze.who をどうすればよいですか? この目的のための忘れ関数があると思いますが、それをどのように呼び出すべきかわかりません。

ありがとう。

from bottle import route, run, app, get, abort, request

from StringIO import StringIO
import repoze
from repoze.who.middleware import PluggableAuthenticationMiddleware
from repoze.who.interfaces import IIdentifier
from repoze.who.interfaces import IChallenger
from repoze.who.plugins.basicauth import BasicAuthPlugin
from repoze.who.plugins.auth_tkt import AuthTktCookiePlugin
from repoze.who.plugins.cookie import InsecureCookiePlugin
from repoze.who.plugins.form import FormPlugin
from repoze.who.plugins.htpasswd import HTPasswdPlugin
from repoze.who.classifiers import default_request_classifier
from repoze.who.classifiers import default_challenge_decider    

import logging, sys
import pprint

@route('/')
def root():
    if request.environ.get('repoze.who.identity') is None:
        abort(401, "Not authenticated")
    return "Authenticated"


@route('/hello')
def index():
    identity = request.environ.get('repoze.who.identity')
    if identity == None:
        abort(401, "Not authenticated")

    user = identity.get('repoze.who.userid')
    return '<b>Hello %s!</b>' % user

@route('/logout')
def logout():
    # I have no idea what to put here
    pass

io = StringIO()
salt = 'aa'

for name, password in [ ('admin', 'admin'), ('paul', 'paul') ]:
    io.write('%s:%s\n' % (name, password))
io.seek(0)

def cleartext_check(password, hashed):
    return password == hashed

htpasswd = HTPasswdPlugin(io, cleartext_check)
basicauth = BasicAuthPlugin('repoze.who')
auth_tkt = AuthTktCookiePlugin('secret', 'auth_tkt')
form = FormPlugin('__do_login', rememberer_name='auth_tkt')
form.classifications = { IIdentifier:['browser'],
                         IChallenger:['browser'] }
identifiers = [('form', form),('auth_tkt',auth_tkt),('basicauth',basicauth)]
authenticators = [('htpasswd', htpasswd)]
challengers = [('form',form), ('basicauth',basicauth)]
mdproviders = []


log_stream = None
import os
if os.environ.get('WHO_LOG'):
    log_stream = sys.stdout

middleware = PluggableAuthenticationMiddleware(
    app(),
    identifiers,
    authenticators,
    challengers,
    mdproviders,
    default_request_classifier,
    default_challenge_decider,

    log_stream = log_stream,
    log_level = logging.DEBUG
    )

if __name__ == '__main__':
    run(app=middleware, host='0.0.0.0', port=8080, reloader=True)
else:
    application = middleware

run(host='0.0.0.0', port=8080)
4

2 に答える 2

2

できれば、RedirectingFormPluginではなく使用しますFormPluginRedirectingFormPluginログアウトURLを登録できます。これを使用すると、リクエストをインターセプトし、忘れるなどの呼び出しを処理する/logoutなどのハンドラーを実装する必要はありません。RedirectingFormPluginこれを Bobo と appengine で使用しましたが、うまく機能します。

于 2012-07-12T12:26:18.023 に答える