如何更改Django管理界面的URL?

16
为了增加一点额外的安全性,我想要将默认的Django管理URL更改为自定义的URL,例如将mysite.com/admin/更改为mysite.com/mysecretadmin/,以便通过默认URL完全无法访问管理界面。
我尝试了一些来自互联网的解决方案,例如我像这样更改了urls.py文件:
from django.conf.urls import patterns, url, include
from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('api.views',
    ...,
    ...,
    url(r'^secret-admin-url/', include(admin.site.urls)),
)

很遗憾,对我来说什么都没用。有人知道解决办法吗?我使用的是django 1.5.4版本。

这是正确的解决方案。你可以尝试将其放在列表的顶部以进行调试。 - andrea.ge
原来我使用了错误的urls.py文件。我的应用程序有两个——一个是主urls.py,另一个是app目录中专门的urls.py。你必须更改主urls.py文件。 - Aleksei Petrenko
4个回答

11

以上链接现在似乎已经失效。 - Prakhar Agrawal
1
@PrakharAgrawal 如果你正在使用较新版本的Django,请尝试更改管理员的URL url(r'^<custom-url>/', admin.site.urls)。这在最近的Django版本中可以正常工作,没有任何问题。 - cutteeth
那个程序在开始的时候,由于某种未知原因,在每几个请求之后就会出现错误。错误信息显示^admin$仍然是一个有效的URL。随着时间的推移,它变得更加稳定,现在它可以正常工作了。我非常困惑为什么会发生这种情况,所以我认为我可能需要在其他地方进行更改。 - Prakhar Agrawal
为了增加安全性,将admin/更改为类似于admin_NAtEsoNsibingSTilEBOl的内容。当您使用href="{% url 'admin:index'时,它将引用到此链接... - Bruno Vermeulen

5

对于最近查看此问题的人。 根据Django 3.1文档:

在URL/admin/处注册默认的AdminSite实例django.contrib.admin.site

# main project urls.py
from django.contrib import admin
from django.urls import path

urlpatterns = [
    path("admin/", admin.site.urls),
]

您可以轻松地更改admin/ URL为任何您想要的内容:

urlpatterns = [
    path("my_custom_url/", admin.site.urls),
]

3
如果您不想使用默认页面/admin,可以在urls.py中为admin添加一个秘密密钥。请注意保留HTML标记。
urlpatterns = [
    path('admin_eTiOmEthelInEwathbace/', admin.site.urls,),
]

如果在您的模板中有一个链接

<a href="{% url 'admin:index' %}">Admin</a>

那么这将引用上述网站的URL:http://127.0.0.1:8000/admin_eTiOmEthelInEwathbace/

现在您不想发布此 secret_key ,因此可以使用例如 decouple 从环境变量中获取它,因此 urls.py 将变为:

from decouple import config
SECRET_ADMIN = config('SECRET_ADMIN')

urlpatterns = [
    path(f'admin_{SECRET_ADMIN}/', admin.site.urls,),
]

3
如果您想防止暴力破解或字典攻击,并且未经授权的用户和普通用户无法访问管理员登录页面,请按照以下步骤操作:
首先安装Django Admin Honeypot和Signal。
pip install django-admin-honeypot(inastall in settings.py)
pip install django-honeypot-signals(inastall in settings.py)

覆盖这个 .txt 文件(因为 future 标签已被弃用):

templates/honeypot_signals/notification.txt:

{% load i18n %}
{% blocktrans with site_name=site.name %}
{% endblocktrans %}

Invalid login attempt from your duplicate ADMIN panel..
• Review entry at http://{{ site.domain }}{% url "admin:admin_honeypot_loginattempt_change" object.id %} 

Username: {{ object.username }}
IP: {{ object.ip_address }}
Timestamp: {{ object.timestamp }}

django-admin-honeypot 可以制作一个虚假的管理员登录页面,而 django honeypot signal 会在有人尝试访问您的虚假管理员登录页面时向管理员发送包含凭据的电子邮件。

如何访问主要的管理员登录页面?:

  • pip install django-decorator-include

您的主 urls.py:

from django.contrib import admin
from django.urls import path
from django.urls.conf import include
from . import settings
from decorator_include import decorator_include
from django.contrib.auth.decorators import login_required, user_passes_test
from django.core.exceptions import PermissionDenied
from django.core.mail.message import EmailMessage
from datetime import datetime
from django.views.generic.base import RedirectView

def only_user():
    def check(user):
        if user.is_authenticated and user.is_superuser or user.is_staff:
            return True
        
        time = datetime.now()
        message = f'----------------------------------\nName: {user.username}\nEmail: {user.email}\nTime: {time}.\n----------------------------------\n • {user.username} is not a staff user or admin.For some security reasons..Please block this user from your admin panel(Blacklist).'
        
        email = EmailMessage(
                            f'Alert!! {user.username} is try to accessing your admin panel!!', 
                            message,
                            settings.EMAIL_HOST_USER,
                            [settings.EMAIL_HOST_USER], 
                            )
        email.fail_silently = False
        email.send()
        
        raise PermissionDenied
    return user_passes_test(check)

urlpatterns = [  
                 
    path('', include('product.urls')),
    
    #This is all fake admin urls...
    path('admin/', include('admin_honeypot.urls', 
          namespace='admin_honeypot')),
    path('site/admin/',RedirectView.as_view(url='/admin')),
    path('user/admin/',RedirectView.as_view(url='/admin')),
    path('secure/admin/',RedirectView.as_view(url='/admin')),
    path('mysite/admin/',RedirectView.as_view(url='/admin')),
    path('admin/secure',RedirectView.as_view(url='/admin')),
    path('real/admin/',RedirectView.as_view(url='/admin')),
    
    #This is real admin login page url
    path('custom_url/', 
         decorator_include([login_required, only_user()], 
         admin.site.urls)),

]

对于这种方式,您无法直接访问管理员登录页面。首先需要登陆您的网站,然后才能访问您的管理员面板。

如何保护网站的登录页面免受攻击者攻击?:

 - Use django defender (https://django-defender.readthedocs.io/en/latest/)
 ---------------------OR-------------------------
 - Use google hidden(ReCaptchaV2Invisible) recaptcha field 
 (https://pypi.org/project/django-recaptcha/)

如果检测到任何未经授权的用户恶意活动,您可以使用这个Django包阻止他们的IP地址或用户名:

pip install django-blacklist

阅读文档:django-blacklist

•抱歉我的英语不好


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