Django admin.site.urls只能被超级用户访问(管理员登录页面只能被超级用户访问)

5
我希望的是将访问django管理登录页的权限限制为仅超级用户。这意味着如果您不是超级用户,并尝试访问http://127.0.0.1:8000/admin - 您应该被重定向到404页面或类似的内容。如何执行身份验证的手段或自定义视图是一个挑战。请有经验的人给我提示如何做到这一点?
  urlpatterns = [
     path('admin/', my_custom_function,name="check_if_superuser"),


     # when somebody hits this url pattern , he/she should be taken to the 
     # function above for checking if superuser befor being redirected to 
     # django admin login page
 ]

在我的views.py文件中,我有以下函数来进行身份验证:

    def  my_custom_function(request):
         if request.user.is_superuser():
            #... redirect to django admin login page

         else:
             # return render(404_page)

yeah something like that.


1
这有什么问题,听起来很好。 - Cyzanfar
我在哪里可以找到或重定向到Django管理登录模板? - Seyyid Said
我应该仅对已登录的用户执行检查,并查看他们是否为超级用户。 - Seyyid Said
这里可以查看类似的帖子:https://stackoverflow.com/questions/21584935/django-admin-redirect-after-a-successful-login - Cyzanfar
你的问题没有意义。如果用户没有登录,你怎么知道他们是超级用户?而如果他们已经登录,为什么还需要访问登录页面呢? - Daniel Roseman
显示剩余2条评论
2个回答

2

默认情况下,Django管理面板仅允许超级用户或工作人员用户登录。因此,拥有管理员登录面板是比较安全的。而且,如果您想限制该登录路径,我认为最好在该特定路由上放置防火墙。这样只有白名单IP才能访问它。您可以使用NGINX进行此操作,并且配置应该如下所示:

location /admin {
  # block one workstation
  deny    192.168.1.1;
  # allow anyone in 192.168.1.0/24
  allow   192.168.1.0/24;
  # drop rest of the world 
  deny    all;
}

这篇文章可以帮助你进行配置。

我没有点踩,但这个回答似乎根本没有回答问题。(不过话说回来,这个问题本身也不太有意义。) - Daniel Roseman
我个人认为,这种限制(当用户应该访问管理员站点时)应该在NGINX、Apache等服务器中完成,而不是在Django应用程序中完成。确实,这个答案没有提供任何关于Django方面的普通用户限制的内容。无论如何,谢谢。 - ruddra

1
我认为在所描述的场景中可能存在一个进退两难的情况。
1.要检查用户权限,必须有已登录的用户。 2.如果仅对可用用户进行检查 - is_superuser并显示404:
- 已登录的非超级用户将收到404错误 - 未登录的访客可以访问管理页面
3.如果您添加检查用户是否已登录,如果没有则同样显示404:
- 没有人可以从管理页面登录,除非已在其他地方登录并随后转到管理页面
这两种情况听起来都不一致。我认为您试图完成的操作意图是以Django框架稍微不同的方式实现的。
在django.contrib.admin.sites的AdminSite类中有一个has_permission()方法,它会返回True,如果给定的HttpRequest有权限查看管理站点中至少一个页面。默认情况下,它返回request.user.is_active和request.user.is_staff。如果您在admin.py中进行更改,只有活动的超级用户才能使用管理员功能。
from django.contrib import admin

def has_superuser_permission(request):
    return request.user.is_active and request.user.is_superuser

# Only active superuser can access root admin site (default)
admin.site.has_permission = has_superuser_permission

即使非管理员用户登录,也会显示权限不足的消息,并提示重新登录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接