2012-07-12 6 views
4

나는 repoze.who로 bottle.py 작업을 시도하고 있으며, 지금까지 발견 한 다양한 예제를 조합하여 작동시키기 위해 다음과 같은 매우 단순한 프로그램을 작성했습니다. 분명히 이것은 프로덕션 환경에서 실행되는 것이 아닙니다. 가능한 가장 복잡한 코드를 만들려고 노력하는 것입니다. 사용법을 배울 수 있습니다.하지만 불행히도 repoze와 함께 bottle.py를 사용하는 방법에 대한 자습서가 있습니다. 아주 적은 수의.repoze.who (및 bottle.py)를 사용하여 로그 아웃을 처리하는 방법은 무엇입니까?

아래 예제는 작동하며 누군가가 admin/admin의 사용자 이름/비밀번호로 로그인 할 수 있도록 허용합니다. 내가 repoze.who logout() 함수를 작동하게하기 위해 무엇을 해야하는 건가요? 나는이 목적을 위해 잊어 버릴 수있는 기능이 있다는 것을 모았지만, 나는 그것을 어떻게 부르는 지 알 수 없다.

감사합니다.

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) 

답변

2

당신은 내가 RedirectingFormPlugin보다는 FormPlugin 사용하는 것이 할 수 있습니다. RedirectingFormPlugin을 사용하면 로그 아웃 URL을 등록 할 수 있습니다. 그것으로 당신은 RedirectingFormPlugin이 요청을 가로 채고 잊어 버리는 호출을 처리하는 것처럼 /logout 핸들러를 구현할 필요가 없습니다. 나는 이것을 Bobo와 appengine에 사용했으며 잘 작동합니다.

+0

덕분에, 지금은 붙어 있지만, 다른 방법으로 ... – paul88888

+1

내가 도와 줘야 할지도 모르겠다면 appengine의 맞춤 인증을 위해 광범위하게 사용했습니다. (병은 아니지만 url 매핑에 보보를 사용했습니다.) –

0

당신은 아직도 그것을 오래된 repoze.who v1을에서 바람직하지 않다 방법을 수행하려는 경우는, 나를 위해 일한 다음 그 일을 더 나은 방법처럼 보인다

from bottle import response # , redirect 
# ... 
@route('/logout') 
def logout(): 
    identity = request.environ.get('repoze.who.identity') 
    if identity: 
     for (i_name, i) in identifiers: 
      hdrs = i.forget(request.environ, identity) 
      [ response.add_header(*h) for h in hdrs ] 
    ## following would be nice, but does not work, 
    ## since redirect is not using defined response headers 
    # rfr = request.get_header('referer', '/') 
    # redirect(rfr) 
    ## so we do just this: 
    return "you have been hopefully logged out"