3

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

我必须为我正在处理的这个网站滚动我自己的权限,我不想用相同的代码阻塞我为整个网站编写的几乎每个视图,所以我认为中间件会是一个好主意,但我不知道该怎么做。

4

2 回答 2

8

是的,这是可能的。process_request的 django中间件文档表明:

def process_request(自我,请求)

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

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

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

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

如果这很有吸引力,请参阅编写身份验证后端。

于 2009-04-15T22:46:58.667 回答
1

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

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

If your requirement is that much simple, it is fine, since you don't have to touch views.

But in general, Permission system is much complex than that, for example:

  1. User can access FOO/show_all/
  2. But, he can't see or access foo instance, i.e, FOO/show/foo_1/
  3. Since, he can't access foo_1 instance, we should not show them in show_all (all foo instances)

If you want implement above 3 together, I suggest you write your own custom authorization backend for Django. All you need to do is implement few methods (your specific logic) and attach as backend.

于 2010-08-25T12:05:26.823 回答