基于用户的Django认证用户

1 投票
2 回答
640 浏览
提问于 2025-04-17 20:49

我在做一个django项目时遇到了困难,我使用了django自带的登录系统,一切都运行得很好。我有三个用户,第一个用户可以看到“管理员面板”,第二个用户可以看到“信息捕获面板”,而第三个用户只能看到前两个用户打印的内容。

我有几个问题:

我需要怎么给每个用户设置权限?

我怎么才能把每个面板重定向到对应的用户?

附注:我已经为每个面板准备好了模板、网址和视图,但我不知道怎么显示它们。

非常感谢你们花时间回答这个新手的问题,我才刚开始接触这个框架一周。


更新

现在我遇到了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"),

)

这是我的views.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 个回答

1

我需要给每个用户什么权限?

你需要为每种类型的用户创建一个组,比如“超级用户”、“普通用户”和“受限用户”。这些组可以在Django的管理控制台中创建,然后你可以通过同样的管理控制台把每个用户分配到相应的组里。

我怎么能把每个面板重定向到对应的用户?

你需要定义一个重定向视图,这个视图会根据用户所属的组,把用户的请求转发到相应的“面板”视图。

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

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

  2. 在settings.py中更改LOGIN_REDIRECT_URL,使其指向这个重定向视图

    LOGIN_REDIRECT_URL = reverse('panel-redirect')

当用户登录时,他们会被重定向到重定向视图,然后这个视图会根据他们所属的组把他们引导到正确的面板。

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(...)

撰写回答