나는 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)
덕분에, 지금은 붙어 있지만, 다른 방법으로 ... – paul88888
내가 도와 줘야 할지도 모르겠다면 appengine의 맞춤 인증을 위해 광범위하게 사용했습니다. (병은 아니지만 url 매핑에 보보를 사용했습니다.) –