【问题标题】:Django Middleware + URL'sDjango 中间件 + URL
【发布时间】:2009-04-15 21:59:48
【问题描述】:

中间件是否可以检查 url 中是否有值,例如图像 id ("/image/152/"),如果是,则进行一些检查以确保当前用户具有查看权限该图像,如果不重定向到另一个网址?

我不得不为我正在开发的这个网站提供自己的权限,而且我不想用相同的代码阻塞我为整个网站编写的几乎所有视图,所以我认为中间件是个好主意为此,但我不知道该怎么做。

【问题讨论】:

    标签: django middleware


    【解决方案1】:

    是的,这是可能的。 django middleware docs for process_request 表示:

    def process_request(self, request)

    request 是一个 HttpRequest 对象。在 Django 决定执行哪个视图之前,每个请求都会调用此方法。

    process_request() 应该返回 None 或 HttpResponse 对象。如果它返回 None,Django 将继续处理这个请求,执行任何其他中间件,然后是适当的视图。如果它返回一个 HttpResponse 对象,Django 不会费心调用任何其他请求、视图或异常中间件或适当的视图;它会返回那个 HttpResponse。

    HttpRequest 对象有一个path 属性,该属性将为您提供所请求的 URL。

    但是,如果您愿意,请注意,您还可以扩展 Django 的身份验证后端系统,以根据任意标准(例如您的手动权限方案)向请求中的用户填充权限。这样,您可以利用默认的身份验证装饰器(@permission_required@user_passes_test),其他应用程序/管理站点也将能够尊重您的权限。 User 对象和创建的权限不需要驻留在 Django 的用户/权限表中,可以在登录时虚拟创建;我在这方面取得了相当大的成功。

    如果这很有吸引力,请参阅Writing an authentication backend

    【讨论】:

      【解决方案2】:

      如果你在中间件中实现授权(Permission system),你最终会得到两种选择:

      1. 检查 URL 并允许访问
      2. 检查 URL 并拒绝访问

      如果您的要求这么简单,那很好,因为您不必触摸视图。

      但总的来说,权限系统比这复杂得多,例如:

      1. 用户可以访问 FOO/show_all/
      2. 但是,他看不到或访问 foo 实例,即 FOO/show/foo_1/
      3. 既然他不能访问 foo_1 实例,我们不应该在 show_all 中显示它们 (所有 foo 实例)

      如果你想同时实现以上3个,我建议你write your own custom authorization backend for Django。您需要做的就是实现一些方法(您的特定逻辑)并附加为后端。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-09
        • 1970-01-01
        • 2019-02-01
        • 2013-12-10
        • 1970-01-01
        • 2018-07-12
        相关资源
        最近更新 更多