【问题标题】:Restrict access to non-api view in Django Rest Framework在 Django Rest Framework 中限制对非 api 视图的访问
【发布时间】:2016-03-11 11:06:00
【问题描述】:

我正在使用Django REST Framework 和来自djoser 的基于令牌的身份验证构建一个带有REST API 后端的网站。

该站点的用户页面可通过管理页面进行编辑(例如<page-url>/admin) 除非您是所有者,否则它们不应该是可访问的。当request.user 不可用时,限制对非 API 视图的访问的最佳方法是什么?

【问题讨论】:

  • 您是否使用平面页面或其他东西作为用户页面?
  • 页面数据存储在数据库中,并在前端从 JSON 呈现。应限制的页面指向包含 javascript 等的静态 html。

标签: django authentication django-rest-framework


【解决方案1】:

有两种简单的方法可以限制匿名用户的访问:

  1. 只需为视图的非 request.user 访问添加规则:

    def admin_view(token):
        if not Token.objects.get(token=token):
            return redirect('%s' % (settings.LOGIN_URL))
    
  2. 为您的管理视图添加装饰器:

    from django.contrib.auth.decorators import login_required
    
    @login_required(login_url='/accounts/login/')
    def admin_view(view):
        ...
    

    在这种情况下,您必须更新基类中的 login_required mixin 或编辑默认的身份验证/权限中间件,但这取决于您的实际身份验证系统的行为。

【讨论】:

    【解决方案2】:

    我正在使用装饰器来限制匿名用户的访问。

    from django.contrib.auth.decorators import login_required
    
    urlpatterns = patterns(
    url(r'^page_url/$', login_required(MyView.as_view())),
    )
    

    为了翻译,我修改了 TemplateView。您可以创建一个 TemplateView 类来限制对静态页面的访问。

    class TemplateView(TemplateResponseMixin, ContextMixin, View):
    
        """
        A view that renders a template.  This view will also pass into the context
        any keyword arguments passed by the url conf.
        """
        def get(self, request, **kwargs):
            try:
                current_user = request.user
                if current_user.is_authenticated() and (bool(request.path_info == '/') or bool(request.path_info == '/login/')):
                    return HttpResponseRedirect('/dashboard')
                current_language = current_user.language_code
                translation.activate(current_language)
                context = self.get_context_data(**kwargs)
                return self.render_to_response(context)
            except:
                context = self.get_context_data(**kwargs)
                return self.render_to_response(context)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-26
      • 2015-11-12
      • 2014-12-05
      • 2018-10-24
      • 1970-01-01
      • 2019-06-07
      • 2015-04-23
      • 2014-05-10
      相关资源
      最近更新 更多