【问题标题】:Django: redirect if url was written manually by userDjango:如果 url 是由用户手动编写的,则重定向
【发布时间】:2018-10-18 04:37:39
【问题描述】:

是否可以限制用户手动放置页面的url?

假设我有两个页面 - somepage.com/home 和 someplace.com/other,主页中的某处是将用户重定向到 /other 站点的按钮。我想确保用户无法通过手动编写其 url 来访问 /other。相反,它应该重定向回主页。

是否有像 login_required 这样的装饰器可以使用?或者我应该使用一些js函数?

提前感谢任何提示,干杯。

【问题讨论】:

    标签: javascript html django redirect django-views


    【解决方案1】:

    尝试使用html的referrer属性,如果用户通过点击您主页中的链接转到其他页面,则referrer指向您的主页。但是如果用户手动输入了其他页面链接,那么引用者将不会指向您的主页。

    返回值:一个字符串,表示加载当前文档的文档的 URL。返回整个 URL,包括协议(如 http://)。如果当前文档不是通过链接打开的(例如,通过书签),则返回一个空字符串。

    参考:https://www.w3schools.com/jsref/prop_doc_referrer.asp

    其他效率不高的解决方案:

    1. 您不需要登录功能?如果您需要,那么只需继续实现一个并将另一个视图标记为 login_required。 如果您不需要,请阅读第 2 点。

      1. 您可以从主页按钮发布一些随机唯一值以转到其他页面。在其他视图中检查该值。如果未找到该值,则重定向到主页。如果找到,则显示其他视图。 如果用户通过输入 url 访问页面,则该值将丢失那些重定向到主页的发生。需要注意的一点是,此解决方案并不安全。如果您不实施足够安全,用户可以欺骗服务器。

    【讨论】:

    • 我也有类似的想法,但是这个安全漏洞让我在这里发布了这个问题:)
    • 太棒了!它看起来正是我想要的。非常感谢。
    【解决方案2】:

    您可以构建一个中间件并使用它。 首先,您需要给每个用户一个组或访问该用户的权限。我使用 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"] 
            ),
        )
    

    现在你需要创建 middelware 文件:

    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',
    ]
    

    如果您有任何问题,请在评论中提问。希望您的问题得到解决。

    【讨论】:

    • 我不确定我是否理解它是如何工作的。这个中间件如何知道 url 是否是手工放置的?
    猜你喜欢
    • 2018-12-12
    • 2016-12-28
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多