身份验证用户Django取决于用户

时间:2014-03-04 17:29:19

标签: python django login

我被困在我的django项目上,我使用了django默认登录系统,这里一切都很好用,我有3个用户,第一个得到一个“管理面板”,第二个得到一个“捕获信息面板”和第三个只能看到其他2个用户打印的内容。

我的问题是:

我需要为每个用户授予哪些权限? 如何将每个面板重定向到各自的用户?

P.S。我已经为每个面板提供了他们的网址和视图的模板,但我不知道如何展示它们。

提前感谢您花时间回答这个新手问题,但我刚开始在一周前使用这个框架。


更新

现在我收到404错误,而不是获取我应该重定向的页面。

这是我的urls.py

from django.conf.urls import patterns, include, url
from .views import PanelRedirectView,PanelCapturista

urlpatterns = patterns('',

url(r'^$' , 'django.contrib.auth.views.login', {'template_name':'inicio/index.html'},
    name='login'),

url(r'cerrar/$' , 'django.contrib.auth.views.logout_then_login', name='logout'),

url(r'^panel-capturista/$' , PanelCapturista.as_view() , name="panel-capturista"),

我的观点.py

from django.core.urlresolvers import reverse_lazy
from django.views.generic.base import RedirectView,TemplateView


class PanelRedirectView(RedirectView):

    def get_redirect_url(self, *args, **kwargs):
        user = self.request.user
        if user.groups.filter(name='gerente').count():
            return reverse_lazy('panel-gerente')
        elif user.groups.filter(name='capturista').count():
            return reverse_lazy('panel-capturista')
    else:
        return reverse_lazy('cliente')

class PanelCapturista(TemplateView):
    template_name = 'capturista/panel-capturista.html'

2 个答案:

答案 0 :(得分:1)

之类的东西(可能重新发明轮子)

class require_permission:
     def __init__(self,permission,redirect="index/denied_access"):
       self.perm = permission
       self.redirect = redirect

    @require_login
    def __call__(self,f):
        def fn(self,request,*args,**kwargs):
           if not request.user.has_perm(self.perm):
               redirect(self.redirect)
           return f(request,*args,**kwargs)
        return fn

 ...

 @require_permission(PERMISSION.CAN_VIEW_ADMIN,'index/capture_info')
 def admin_view(request,*args,**kw):
     return HttpResponse(...)

 @require_permission(PERMISSION.CAN_CAPTURE_INFO,'index/basic_user')
 def capture_view(request,*args,**kw):
      return HttpRespone(...)

 @require_login
 def basic_view(request,*args,**kw):
      return HttpResponse(...)

答案 1 :(得分:1)

我需要为每个用户授予什么权限?

您在此处想要的是针对每种类型的用户(https://docs.djangoproject.com/en/dev/topics/auth/default/#groups)的组。例如。 “超级用户”,“普通用户”和“受限用户”。可以在Django管理控制台中创建这些组,然后可以使用相同的Django管理控制台(https://docs.djangoproject.com/en/dev/topics/auth/default/#managing-users-in-the-admin)将每个用户分配到各自的组。

如何将每个面板重定向到各自的用户?

您需要定义一个RedirectView,它根据用户指定的组(https://docs.djangoproject.com/en/dev/ref/class-based-views/base/#redirectview)将用户的请求转发到预期的“面板”视图。

from django.core.urlresolvers import reverse
from django.views.generic.base import RedirectView

from articles.models import Article

class PanelRedirectView(RedirectView):

    def get_redirect_url(self, *args, **kwargs):
        user = self.request.user
        if user.groups.filter(name='superuser').count():
            return reverse('superuser-panel')
        elif user.groups.filter(name='regular_user').count():
            return reverse('regular-user-panel')
        else:
            return reverse('restricted-user-panel')

然后,您可以使用Joran描述的注释来限制对重定向到的特定视图的访问。我描述的示例使用基于用户组的限制,而他的答案使用基于用户权限的限制。在处理像您所描述的简单权限方案时,这更像是个人偏好。

*更多细节*

要在登录时重定向用户...

  1. 在urls.py

    中为重定向视图创建一个已命名的网址

    url(r'^ panel-redirect / $',PanelRedirectView.as_view(),name =“panel-redirect”),

  2. 更改settings.py中的LOGIN_REDIRECT_URL以指向登录时的此重定向视图

    LOGIN_REDIRECT_URL =反向('panel-redirect')

  3. 当该人登录时,他们将被重定向到RedirectView,而RedirectView又会根据他/她指定的组将该人重定向到正确的面板