Django: перенаправление, если URL был написан пользователем вручную - PullRequest
0 голосов
/ 08 мая 2018

Можно ли запретить пользователю вводить URL страницы вручную?

Допустим, у меня есть две страницы - somepage.com/home и someplace.com/other, и где-то на главной странице есть кнопка, которая перенаправляет пользователя на / другой сайт. Я хочу убедиться, что пользователь не сможет получить доступ к / другим, написав свой URL вручную. Вместо этого он должен перенаправить обратно на домашнюю страницу.

Может быть, есть какой-нибудь декоратор, такой как login_required, который я могу использовать? Или, может быть, я должен использовать некоторую функцию JS?

Заранее спасибо за любые советы, ура.

Ответы [ 2 ]

0 голосов
/ 08 мая 2018

Вы можете создать промежуточное программное обеспечение и использовать его. Во-первых, вам нужно предоставить каждому пользователю группу или доступ к пользователю. Я сделал это с user_type. Теперь вы создаете файл acl и создаете пакет с URL-адресом.

acl.py

    acl_view_segment_divided = {
        "pack_1": [
            "url_name_1",
            "url_name_2",
            .
            .
            .
        ],
        "pack_2": [
            "url_name_3",
            "url_name_4",
            .
            .
            .
        ],
    }

    acl_view_segment = dict(
        user_type_1=list(
            acl_view_segment_divided["pack_1"] +
            acl_view_segment_divided["pack_2"]
        ),
        user_type_2=list(
            acl_view_segment_divided["pack_1"] 
        ),
    )

Теперь вам нужно создать файл промежуточного программного обеспечения:

middleware.py

from django.conf import settings
from django.utils.deprecation import MiddlewareMixin
from django.core.urlresolvers import resolve
from acl import acl_view_segment
from django.shortcuts import render
from django.contrib import auth

from apps.main.views import page_permission_denied_view


class ACLMiddleware(MiddlewareMixin):
    @staticmethod
    def process_view(request, view_func, view_args, view_kwargs):
        if not request.user.is_authenticated():
            return

        current_url = resolve(request.path_info).url_name

        if current_url in getattr(settings, 'ACL_EXEMPT_VIEWS', set()):
            return

        user_type = request.user.user_type

        acl = acl_view_segment[user_type]

        if current_url not in acl:
            return page_permission_denied_view(request)
            or
            return redirect(home_page)

добавлено промежуточное программное обеспечение для setting.py

settings.py

MIDDLEWARE = [
    ...
    'yourproject.middleware.ACLMiddleware',
]

Если у вас есть вопросы, задавайте вопросы в комментариях. Я надеюсь, что ваша проблема решена.

0 голосов
/ 08 мая 2018

Попробуйте использовать свойство реферера в html, если пользователь переходит на другую страницу, щелкнув ссылку на вашей домашней странице, тогда реферер указывает на вашу домашнюю страницу. Но если пользователь вручную набрал ссылку на другую страницу, то реферер не будет указывать на вашу домашнюю страницу.

Возвращаемое значение: строка, представляющая URL-адрес документа, который загрузил текущий документ. Возвращает весь URL, включая протокол (например, http://). Если текущий документ не был открыт по ссылке (например, через закладку), возвращается пустая строка.

Ссылка: https://www.w3schools.com/jsref/prop_doc_referrer.asp

Другие, не очень эффективные решения:

  1. Вам не нужно входить в систему? Если вам нужно, просто перейдите к реализации и пометьте другое представление как login_required. Если вам это не нужно, прочитайте пункт № 2.

    1. Вы можете ПОСТАВИТЬ некоторое случайное уникальное значение с кнопки домашней страницы, чтобы перейти на другую страницу. И в другом представлении проверьте это значение. Если это значение не найдено, перенаправьте на домашнюю страницу. Если найдено, отобразите другой вид. Если пользователь заходит на страницу путем ввода URL-адреса, в этом значении будет отсутствовать перенаправление на домашнюю страницу. Стоит отметить, что это решение не является безопасным. Пользователи могут обмануть сервер, если вы не реализуете достаточно безопасно.
...