首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >password_reset仅适用于未登录的用户

password_reset仅适用于未登录的用户
EN

Stack Overflow用户
提问于 2011-02-18 21:09:16
回答 2查看 368关注 0票数 0

是否可以拒绝通过身份验证的用户访问django.contrib.auth.views.password_reset?我想使用它,并将其设置为仅用于未登录。

我不知道该怎么做。我已经用reset做了所有的事情,但是所有用户都可以进入:/

更新:我就是这么做的:

views.py

代码语言:javascript
复制
def password_remind(request):
    from django.contrib.auth.views import password_reset
    if request.user.is_authenticated():
        return HttpResponseRedirect(reverse('index'))

    return password_reset(request, template_name='remind_password.html', post_reset_redirect=reverse('password_remind_sent'))

def password_remind_sent(request):
    from django.contrib.auth.views import password_reset_done
    if request.user.is_authenticated():
        return HttpResponseRedirect(reverse('index'))

    return password_reset_done(request, template_name='remind_password.html')

def password_remind_set_new(request, uidb36, token):
    from django.contrib.auth.views import password_reset_confirm
    if request.user.is_authenticated():
        return HttpResponseRedirect(reverse('index'))

    return password_reset_confirm(request, template_name='set_new_password.html', post_reset_redirect=reverse('password_remind_changed'), token=token, uidb36=uidb36)

def password_remind_changed(request):
    from django.contrib.auth.views import password_reset_complete
    if request.user.is_authenticated():
        return HttpResponseRedirect(reverse('index'))

    return password_reset_complete(request, template_name='set_new_password.html')

urls.py:

代码语言:javascript
复制
url(r'^remind_password/$', 'password_remind', name='password_remind'),
    url(r'^remind_password/sent/$', 'password_remind_sent', name='password_remind_sent'),
    url(r'^remind_password/set_new/(?P<uidb36>[0-9A-Za-z]+)-(?P<token>.+)/$', 'password_remind_set_new', name='password_remind_set_new'),
    url(r'^remind_password/changed/$', 'password_remind_changed', name='password_remind_changed'),
EN

回答 2

Stack Overflow用户

发布于 2011-02-18 21:44:52

当然,你可以在某些条件下将函数封装在你自己的函数中,并将你的url指向你的包装器函数。(注意传递您之前传递的任何参数...)

代码语言:javascript
复制
from django.contrib.auth.views import password_reset as real_password_reset

def password_reset(request, *args, **kwargs):
    if request.user.is_authenticated():
       # separate logic, redirect, whatever you wish.
       return direct_to_template(request, "my_password_change.html", {}) 
    return real_password_reset(request, *args, **kwargs)


(r'^password_reset/$', password_reset),
票数 2
EN

Stack Overflow用户

发布于 2011-02-18 21:45:18

我会做一个装饰器函数,确保request.user不会通过身份验证,如果通过了身份验证,就会重定向到一个带有403代码的“拒绝访问”页面。

然后,在我的urls.py中,我将包含我想要锁定的视图的url模式(我记得大约有四个),并将方法调用包装在装饰器函数中。

这样的话,你根本不需要修改contri.auth的视图--你只需要把你的代码包起来就行了。

但是,您真的需要阻止用户访问重置密码视图吗?

更新:

示例装饰器函数(未经测试的代码!)

代码语言:javascript
复制
from django.http import HttpResponseForbidden

def unauthenticated_users_only(func):
    """
    Decorator that checks whether a user 
    is logged in. 403s if not. 
    """
    def dec(request, *args, **kwargs):
        if not request.user.is_authenticated():  
            return HttpResponseForbidden()                
        return func(request, *args, **kwargs)

    dec.__doc__ = func.__doc__
    return dec

然后在您的主urls.py中,导入与重置流程相关的所有身份验证urls,并为每个urls导入并应用该函数:

代码语言:javascript
复制
url(r'^password/reset/$', unauthenticated_users_only(auth_views.password_reset), name='auth_password_reset'),
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5041644

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档