Giter Club home page Giter Club logo

django-protector's Introduction

Protector

Protector is used for managing object level permissions in performance efficient way. It supports queryset filtering by permission and user. Also it allow every object in your project to behave as a user group. i.e. adding permissions and users with roles.

Quick start

  1. Install from pip (it will also install required django-mptt):

    pip install django-protector
    
  2. Add "protector" to your INSTALLED_APPS setting:

    INSTALLED_APPS = (
        ...
        'protector',
    )
    
  3. Add protector authentication backend. Also you should remove default auth backend:

    AUTHENTICATION_BACKENDS = (
        ...
        'protector.backends.GenericPermissionBackend'
    )
    
  4. Make some model your default group:

    PROTECTOR_GENERIC_GROUP = 'users.group'
    
  5. Run python manage.py migrate to create the protector models and copy existing user permissions

Now you can check permissions on objects like this:

user.has_perm('some_app.some_perm', user)

Or filter any queryset by permission:

from protector.models import filter_queryset_by_permission
filtered_qset = filter_queryset_by_permission(some_qset, user, 'some_app.some_perm')

Additional steps

  1. Add GenericPermsMixin to your User model to conviniently add permissions and groups:

    class User(UserGenericPermsMixin, AbstractBaseUser)
    
  2. Create some group models. Every model in your project could now behave like a group. You could inherit your models from abstract group to have convinient fields for users and permissions:

    class Group(AbstractGenericGroup):
    
  1. Inherit your Querysets from PermissionQuerySet to conviniently filter by permission:

    some_qset.filter_by_permission(user, 'some_app.some_perm')
    

Now you can manipulate permissions and groups:

user.permissions.all()
user.permissions.add(permission)
user.groups.all()
group.permissions.add(permission)

Restricting access to objects

This is somewhat different from just filtering queryset by permission

  1. Inherit your model from Restricted:

    class Comment(Restricted)
    
  2. Inherit model manager from RestrictedManager:

    class CommentManager(RestrictedManager):
    
  3. Restricted contains some additional fields so you need to run makemigration for your app

  4. Now you can restrict instances of your model:

    comment.restrict()
    

To enable user view one or all restricted objects:

user.permissions.add(Restricted.get_view_permission(), comment)
user.permissions.add(Restricted.get_view_permission())

To filter model objects visible by user:

Comment.objects.visible(user)

Global Permissions

You could define Template-like permissions. For example you want all group moderators to have edit_permission on their group. Such templates could be created In Global Group Permissions admin interface. You should choose ContentType of your group, roles and, of course, permission those roles should have. No further actions required:

user.has_perm('someapp.edit_permission', somegroup)

would return true if user is moderator in somegroup

Permission on Foreign Key to User

Every so often you would like owners of your objects to have some permissions of their objects. Easy peasy. You should inherit you object, for example TestPost from AbstractGenericGroup Like so:

class TestPost(AbstractGenericGroup):
    SUBSCRIBER = 1
    AUTHOR = 2
    ROLES = (
        (SUBSCRIBER, 'Subscriber'),
        (AUTHOR, 'Author')
    )
    author = models.ForeignKey(to=TestUser)

    MEMBER_FOREIGN_KEY_FIELDS = (
        ('author', AUTHOR),
    )

    class Meta:
        permissions = (
            ('manage_post', 'Manage Post'),
        )

MEMBER_FOREIGN_KEY_FIELDS defines which foreign key gets which role.

Notice: This is accomplished via some denormalization and works through create, save and update model and manager methods overloading

django-protector's People

Contributors

fzambia avatar grey0ne avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.