code: def require_perms(view_func, required):
      
      from horizon.exceptions import NotAuthorized
      # We only need to check each permission once for a view, so we'll use a set
      current_perms = getattr(view_func, '_required_perms', set([]))
      view_func._required_perms = current_perms | set(required)
  
      @functools.wraps(view_func, assigned=available_attrs(view_func))
      def dec(request, *args, **kwargs):
          if request.user.is_authenticated:
              if request.user.has_perms(view_func._required_perms):
                  return view_func(request, *args, **kwargs)
          raise NotAuthorized(_("You are not authorized to access %s")
                              % request.path)
  
      # If we don't have any permissions, just return the original view.
      if required:
          return dec
      else:
          return view_func
docs: Enforces permission-based access controls.
  
      :param list required: A tuple of permission names, all of which the request
                            user must possess in order access the decorated view.
  
      Example usage::
  
          from horizon.decorators import require_perms
  
  
          @require_perms(['foo.admin', 'foo.member'])
          def my_view(request):
              ...
  
      Raises a :exc:`~horizon.exceptions.NotAuthorized` exception if the
      requirements are not met.