Django 在登录待定组后重定向用户

标签 django authentication django-templates django-authentication

我通过我的 login.html 页面上的表单使用 django 的“登录 View ”:

    <form class="form-horizontal" method="post" action="{% url 'django.contrib.auth.views.login' %}">
    {% csrf_token %}
  <div class="control-group">
    <div class="controls">
      {{ form.username }}
    </div>
    <div class="controls controlsbtm">
      {{ form.password }}
    </div>
  </div>
  <div class="control-group-bottom">
    <div class="controls-btm">
        <input type="submit" value="Sign In" class="loginBtn" />
        <input type="hidden" name="next" value="{{ next }}" />

    </div>
  </div>        
</form>

我有一个自定义装饰器来检查某些页面,如果用户属于特定组,如果不是,我将他们重定向回登录页面。使用:

@login_required

@user_passes_test(is_admin)

问题是,djangos 内置了返回登录页面的功能,成功登录后会返回到之前的 URL。因此,如果您登录但不在该组中,您将陷入循环。

我想这样:

以 B 组用户身份登录

尝试需要 A 组用户的 URL

  • 返回登录页面

以 B 组用户身份登录

  • 返回标准主页,而不是重定向回之前的网址

或者

以A组用户身份登录

  • 重定向回之前的网址

我该怎么做?

**编辑 在遵循 Jakob 的想法之后,我已经可以将 REDIRECT_URL 指向自定义 View 。 但从这个角度来看,我需要能够说:

原始 URL 希望用户是什么?

是否与新登录的详细信息匹配,如果是,请转到该网址 如果没有,请转到 home.html

我仍然不确定如何做到这一点

最佳答案

您可以使用Settings.LOGIN_REDIRECT_URL

这样,您可以重定向到其他 View ,您可以在其中进行组检查并从那里再次重定向到正确的位置。

编辑: 仅当删除下一个参数时,设置 LOGIN_REDIRECT_URL 才会起作用。来自文档:

The URL where requests are redirected after login when the contrib.auth.login view gets no next parameter.

Here是一个描述如何做的问题。

覆盖 contrib.auth.login 可能是另一种方法。让 Django 执行默认的登录操作,然后检查您的组。然后重定向到正确的位置(通过下一个参数)。

编辑2:

如果我没猜错的话,你需要像下面这样的设置: 失败时始终返回登录页面。

  • 以 A 组用户身份登录:is_admin => True(在组中)=> 成功时重定向到上一页
  • 以 B 组用户身份登录:is_admin => False(不在组中)=> 重定向到默认(受登录保护)页面

试试这个:

url.py

urlpatterns = patterns('',
    url(r'^admin/', include(admin.site.urls), name='nasenb'),
    url(r'^login/', login, {'template_name': 'admin/login.html'}),
    url(r'^adminonly/', admin_only),
    url(r'^protected/', protected_content),
    url(r'^', free_content, name='index'),
)

View .py

def is_admin(user):
    return True #or False for test purpose

# login_url='/protected/': this is the default redirect url 
# where to go if is_admin fails but the login succeeded
@login_required()
@user_passes_test(is_admin, login_url='/protected/', redirect_field_name=None)
def admin_only(request):
    return HttpResponse('Access granted, passed "is_admin"')

@login_required()
def protected_content(request):
    return HttpResponse('this content does''n require admin privs')
"""
this is some previous page
"""
def free_content(request):
    return HttpResponse('Some data! Free for everyone!')

希望这有帮助!

关于Django 在登录待定组后重定向用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23676637/

相关文章:

python - 第一个 dict() 之后内容为空

android - 找不到 com.facebook.katana.provider.AttributionIdProvider 的提供商信息

Django:在模板标签中,cl 是什么意思?

python - 是否可以在 ValidationError 的字符串中使用模板标签?

python - 即使需要字段也会创建对象

python - 在 Linux/Ubuntu 机器上从 Python/Django 设置网络设置

iphone - Ios/iphone 创建/维护网络 session

security - HTTP 和 HTTPS 协议(protocol)

python - 从 Django 模板获取 URL 的第一部分

django - 将 google map 与 django 集成