0

デフォルトでは、Cookieはセッションの終了時に期限切れになるため、ユーザーはブラウザを閉じた後は毎回ログインする必要があります。しかし、rememberオプションについてはどうですか?有効期限なしでCookieを設定する方法は?development.iniファイルを追加しようとしましたsession.cookie_expires = Falseが、役に立ちませんでした。

そして別の質問:カスタムCookieヘッダーを設定する方法(たとえばlang、有効期限のないメインCookieにも)?

編集:

pyramid.authentication.AuthTktAuthenticationPolicyで、セッション間でCookieを保存できるmax_ageパラメーターを見つけました。しかし、(構成)ファイルでチェックボックスを定義し、ログインビューで定義する必要がある場合、チェックボックスを実装するにはどうすればよいですか?remember memax_age__init__.pyremember me

4

3 に答える 3

3

「rememberme」の背後にある考え方は、ログインとセッションの間で持続するオプションであるということです。これは、ユーザーがチェックボックスをオンにした場合に設定できる個別のCookieとして実装するのが最適です。「rememberme」が、ポリシーの有効期限が切れた場合にアプリケーションが再度ログインする必要があることを意味する場合は、有効期限が切れない署名付きCookieを保存するだけです。次に、ユーザーがログインしていないためにアプリケーションが起動した場合HTTPForbidden、Cookieを確認し、Cookieが記憶されていることを確認し、再度ログインして、目的の場所にリダイレクトすることができます。「私を覚えている」という意味によっては、これは1つの選択肢にすぎません。

Pyramidのデフォルトセッションファクトリの構成

セッションファクトリを使用している場合は、引数UnencryptedCookieSessionFactoryConfigに適切な値を渡す必要があります。cookie_max_ageタイムアウトパラメータもチェックされます。これは、Cookie内に保存されている署名付きタイムスタンプです。max_ageと組み合わせると、セッションの実際の有効期限はmax_ageとtimeoutの最小値になります。

http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/api/session.html#pyramid.session.UnencryptedCookieSessionFactoryConfig

カスタムCookieの作成

カスタムCookieを設定するには、必要response.set_cookie()なパラメータを使用して呼び出す必要があります。レンダラーを使用している場合は、を介して使用されている応答オブジェクトにアクセスできますrequest.response。それ以外の場合、自分で応答オブジェクトを手動で作成する場合は、そこに設定するだけです。

http://docs.pylonsproject.org/projects/pyramid/en/1.3-branch/api/response.html#pyramid.response.Response.set_cookie

于 2012-01-04T22:59:41.560 に答える
0

正しい方法ではありませんが、機能します。

def login_user(request, usesr_id, time=None):
"""
@type request: pyramid.request.Request
@type usesr_id: int
@type time: int 
@rtype: Response
"""
request.session["user_id"] = usesr_id
if time is not None:
    request.session._sess.cookie_expires = datetime.timedelta(seconds=time)
    request.session._sess._set_cookie_expires(None)
else:
    request.session._sess.cookie_expires = True
    request.session._sess._set_cookie_expires(None)
request.session._update_cookie_out()
request.session.save()
于 2014-03-26T09:39:45.190 に答える
0

私は同様の解決策を探していました。ユーザー認証にbottle-cork.pyを使用しており、ユーザーに「ログインしたままにする」オプションを提供する方法が必要でした

from bottle, import request, response # etc...

def post_get(name, default=''):
    return bottle.request.POST.get(name, default).strip()

def login():
    """Authenticate users"""
    username = post_get('username').lower()
    password = post_get('password')
    keep_login = post_get('keep_login')
    session = request.environ['beaker.session']
    if keep_login == 'true':
        session.cookie_expires = False
        response.set_cookie('keep_login', "true")
    else:
        session.cookie_expires = True
        response.set_cookie('keep_login', "false")
    aaa.login(username, password)

ただし、リクエストがサーバーに送信されるたびに、bottleは新しいセッションCookieを返します。このCookieは、デフォルトでブラウザを閉じると期限切れに戻ります。これを修正するために、リクエストが送信されるたびに呼び出す関数を追加しました。

def preserve_cookie(request):
    keep_login = request.get_cookie('keep_login')
    session = request.environ['beaker.session']
    if keep_login == 'true':
        session.cookie_expires = False
    return request

したがって、たとえば:

@bottle.get('/get_username')
def check_login(user=None):
    try:
        aaa.require(username=user)
    except:
        raise bottle.HTTPError(401)
    preserve_cookie(request)
    return aaa.current_user.username

このようにして、返される新しいCookieは、ログインセッションを保存したままにするというユーザーの設定を維持します。ただし、beaker.SessionMiddlewareが現在実装されている方法では、Cookieを2038年1月18日に期限切れになるように設定するだけです。

于 2014-08-11T18:13:50.773 に答える