diff options
| author | Tom Christie | 2012-09-20 13:06:27 +0100 | 
|---|---|---|
| committer | Tom Christie | 2012-09-20 13:06:27 +0100 | 
| commit | 4b691c402707775c3048a90531024f3bc5be6f91 (patch) | |
| tree | 3adfc54b0d8b70e4ea78edf7091f7827fa68f47b /rest_framework/permissions.py | |
| parent | a1bcfbfe926621820832e32b0427601e1140b4f7 (diff) | |
| download | django-rest-framework-4b691c402707775c3048a90531024f3bc5be6f91.tar.bz2 | |
Change package name: djangorestframework -> rest_framework
Diffstat (limited to 'rest_framework/permissions.py')
| -rw-r--r-- | rest_framework/permissions.py | 116 | 
1 files changed, 116 insertions, 0 deletions
| diff --git a/rest_framework/permissions.py b/rest_framework/permissions.py new file mode 100644 index 00000000..3a669822 --- /dev/null +++ b/rest_framework/permissions.py @@ -0,0 +1,116 @@ +""" +The :mod:`permissions` module bundles a set of permission classes that are used +for checking if a request passes a certain set of constraints. + +Permission behavior is provided by mixing the :class:`mixins.PermissionsMixin` class into a :class:`View` class. +""" + +__all__ = ( +    'BasePermission', +    'FullAnonAccess', +    'IsAuthenticated', +    'IsAdminUser', +    'IsUserOrIsAnonReadOnly', +    'PerUserThrottling', +    'PerViewThrottling', +) + +SAFE_METHODS = ['GET', 'HEAD', 'OPTIONS'] + + +class BasePermission(object): +    """ +    A base class from which all permission classes should inherit. +    """ +    def __init__(self, view): +        """ +        Permission classes are always passed the current view on creation. +        """ +        self.view = view + +    def has_permission(self, request, obj=None): +        """ +        Should simply return, or raise an :exc:`response.ImmediateResponse`. +        """ +        raise NotImplementedError(".has_permission() must be overridden.") + + +class IsAuthenticated(BasePermission): +    """ +    Allows access only to authenticated users. +    """ + +    def has_permission(self, request, obj=None): +        if request.user and request.user.is_authenticated(): +            return True +        return False + + +class IsAdminUser(BasePermission): +    """ +    Allows access only to admin users. +    """ + +    def has_permission(self, request, obj=None): +        if request.user and request.user.is_staff: +            return True +        return False + + +class IsAuthenticatedOrReadOnly(BasePermission): +    """ +    The request is authenticated as a user, or is a read-only request. +    """ + +    def has_permission(self, request, obj=None): +        if (request.method in SAFE_METHODS or +            request.user and +            request.user.is_authenticated()): +            return True +        return False + + +class DjangoModelPermissions(BasePermission): +    """ +    The request is authenticated using `django.contrib.auth` permissions. +    See: https://docs.djangoproject.com/en/dev/topics/auth/#permissions + +    It ensures that the user is authenticated, and has the appropriate +    `add`/`change`/`delete` permissions on the model. + +    This permission should only be used on views with a `ModelResource`. +    """ + +    # Map methods into required permission codes. +    # Override this if you need to also provide 'view' permissions, +    # or if you want to provide custom permission codes. +    perms_map = { +        'GET': [], +        'OPTIONS': [], +        'HEAD': [], +        'POST': ['%(app_label)s.add_%(model_name)s'], +        'PUT': ['%(app_label)s.change_%(model_name)s'], +        'PATCH': ['%(app_label)s.change_%(model_name)s'], +        'DELETE': ['%(app_label)s.delete_%(model_name)s'], +    } + +    def get_required_permissions(self, method, model_cls): +        """ +        Given a model and an HTTP method, return the list of permission +        codes that the user is required to have. +        """ +        kwargs = { +            'app_label': model_cls._meta.app_label, +            'model_name':  model_cls._meta.module_name +        } +        return [perm % kwargs for perm in self.perms_map[method]] + +    def has_permission(self, request, obj=None): +        model_cls = self.view.model +        perms = self.get_required_permissions(request.method, model_cls) + +        if (request.user and +            request.user.is_authenticated() and +            request.user.has_perms(perms, obj)): +            return True +        return False | 
