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

时间:2014-05-15 11:16:00

标签: django login django-templates django-authentication

我正在使用django'登录视图'通过我的login.html页面上的表单:

    <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组用户的网址

  • 返回登录页面

以B组用户身份登录

  • 返回标准主页,不会重定向回上一个网址

OR

以A组用户身份登录

  • 重定向回上一个网址

我将如何做到这一点?

**编辑 按照雅各布的想法,我已经达到了可以将REDIRECT_URL指向自定义视图的程度。 但在这种观点中,我需要能够说:

原始网址希望用户做什么?

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

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

2 个答案:

答案 0 :(得分:1)

您可以使用Settings.LOGIN_REDIRECT_URL

使用此功能,您可以重定向到其他视图,您可以在其中进行组检查并再次从那里重定向到正确的位置。

编辑: 设置LOGIN_REDIRECT_URL仅在删除下一个参数时有效。来自文档:

  

在contrib.auth.login登录后重定向请求的URL   查看没有下一个参数

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

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

<强> EDIT2:

如果我说得对,你需要一些如下设置: 总是在失败时返回登录页面。

  • 以A组用户身份登录:is_admin =&gt;真(在组中)=&gt;成功时重定向到上一页
  • 以B组用户身份登录:is_admin =&gt;假(不在群组中)=&gt;重定向到默认(登录保护)页面

试试这个:

urls.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'),
)

views.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!')

希望这有帮助!

答案 1 :(得分:1)

This worked for me:

from django.http import HttpResponseRedirect
def loggedin_view(request):
    usergroup = None
    if request.user.is_authenticated():
        usergroup = request.user.groups.values_list('name', flat=True).first()
    if usergroup == "staffGroup":
        return HttpResponseRedirect("/cmit/userDash")
    elif usergroup == "supervisorGroup":
        return HttpResponseRedirect("/cmit/supervisorDash")
    elif usergroup == "auditGroup":
        return HttpResponseRedirect("/cmit/auditDash")
    elif usergroup == "mgtGroup":
        return HttpResponseRedirect("/cmit/mgtDash")
    else:
        return HttpResponseRedirect("/admin/")