Guest User

Untitled

a guest
Nov 21st, 2017
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.15 KB | None | 0 0
  1. import datetime
  2. from functools import wraps
  3.  
  4. from werkzeug.security import (
  5. generate_password_hash,
  6. check_password_hash
  7. )
  8.  
  9. from flask import abort
  10.  
  11. from flask_login import UserMixin, current_user
  12.  
  13. from core import db
  14.  
  15.  
  16. class User(db.Document, UserMixin):
  17. meta = {
  18. 'collection': 'users'
  19. }
  20.  
  21. username = db.StringField()
  22. email = db.EmailField()
  23. password = db.StringField()
  24. roles = db.ListField()
  25.  
  26. created_at = db.DateTimeField(default=datetime.datetime.now())
  27.  
  28. def get_id(self):
  29. return str(self.pk)
  30.  
  31. def set_password(self, password):
  32. self.password = generate_password_hash(password)
  33.  
  34. def check_password(self, password):
  35. return check_password_hash(self.password, password)
  36.  
  37. @staticmethod
  38. def validate_login(password_hash, password):
  39. return check_password_hash(password_hash, password)
  40.  
  41.  
  42. class Permission(db.Document):
  43. meta = {
  44. 'collection': 'permissions'
  45. }
  46.  
  47. role = db.ReferenceField('Role')
  48. action = db.StringField()
  49.  
  50.  
  51. class Role(db.Document):
  52. meta = {
  53. 'collection': 'roles'
  54. }
  55.  
  56. name = db.StringField()
  57. permissions = db.ListField()
  58.  
  59. def has_permission(self, role, action):
  60. return any(
  61. [
  62. role == perm.role.name and action == perm.action
  63. for perm in self.permissions
  64. ]
  65. )
  66.  
  67. def permission_required(permissions):
  68. """
  69. Check if a user has permission to a resource.
  70. :param permissions: List of permissions consistent with tuples. E.g.
  71. [('user', 'read'), ('admin', 'create')]
  72. :return: a function or raise 403
  73. """
  74.  
  75. def wrapper(func):
  76. @wraps(func)
  77. def wrapped(*args, **kwargs):
  78. roles = Permission.objects.distinct('role')
  79. if hasattr(current_user, 'roles'):
  80. if set(current_user.roles) & set(roles):
  81. for role, action in permissions:
  82. for user_role in current_user.roles:
  83. if user_role.has_permission(role, action):
  84. return func(*args, **kwargs)
  85. abort(403)
  86.  
  87. return wrapped
  88.  
  89. return wrapper
Add Comment
Please, Sign In to add comment