【发布时间】:2009-04-15 21:59:48
【问题描述】:
中间件是否可以检查 url 中是否有值,例如图像 id ("/image/152/"),如果是,则进行一些检查以确保当前用户具有查看权限该图像,如果不重定向到另一个网址?
我不得不为我正在开发的这个网站提供自己的权限,而且我不想用相同的代码阻塞我为整个网站编写的几乎所有视图,所以我认为中间件是个好主意为此,但我不知道该怎么做。
【问题讨论】:
标签: django middleware
中间件是否可以检查 url 中是否有值,例如图像 id ("/image/152/"),如果是,则进行一些检查以确保当前用户具有查看权限该图像,如果不重定向到另一个网址?
我不得不为我正在开发的这个网站提供自己的权限,而且我不想用相同的代码阻塞我为整个网站编写的几乎所有视图,所以我认为中间件是个好主意为此,但我不知道该怎么做。
【问题讨论】:
标签: django middleware
是的,这是可能的。 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。
【讨论】:
如果你在中间件中实现授权(Permission system),你最终会得到两种选择:
如果您的要求这么简单,那很好,因为您不必触摸视图。
但总的来说,权限系统比这复杂得多,例如:
如果你想同时实现以上3个,我建议你write your own custom authorization backend for Django。您需要做的就是实现一些方法(您的特定逻辑)并附加为后端。
【讨论】: