Mhdeusi commited on
Commit
970ea0f
·
verified ·
1 Parent(s): 84380cf

Create auth/authorization.py

Browse files
Files changed (1) hide show
  1. auth/authorization.py +64 -0
auth/authorization.py ADDED
@@ -0,0 +1,64 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from functools import wraps
2
+ from flask import request, jsonify
3
+ from .authentication import auth_manager
4
+
5
+ class Authorization:
6
+ def __init__(self):
7
+ self.roles = {
8
+ 'student': 1,
9
+ 'instructor': 2,
10
+ 'admin': 3
11
+ }
12
+
13
+ def require_role(self, required_role):
14
+ """دکوراتور برای بررسی سطح دسترسی"""
15
+ def decorator(f):
16
+ @wraps(f)
17
+ @auth_manager.login_required
18
+ def decorated(*args, **kwargs):
19
+ current_role = getattr(request, 'user_role', 'student')
20
+
21
+ if self.roles.get(current_role, 0) < self.roles.get(required_role, 0):
22
+ return jsonify({
23
+ 'message': f'Insufficient permissions. Required role: {required_role}'
24
+ }), 403
25
+
26
+ return f(*args, **kwargs)
27
+ return decorated
28
+ return decorator
29
+
30
+ def require_roles(self, required_roles):
31
+ """دکوراتور برای بررسی چندین سطح دسترسی"""
32
+ def decorator(f):
33
+ @wraps(f)
34
+ @auth_manager.login_required
35
+ def decorated(*args, **kwargs):
36
+ current_role = getattr(request, 'user_role', 'student')
37
+
38
+ if current_role not in required_roles:
39
+ return jsonify({
40
+ 'message': f'Insufficient permissions. Required roles: {required_roles}'
41
+ }), 403
42
+
43
+ return f(*args, **kwargs)
44
+ return decorated
45
+ return decorator
46
+
47
+ def can_access_lesson(self, user_id, lesson_id):
48
+ """بررسی دسترسی کاربر به درس"""
49
+ # در اینجا می‌توانید منطق پیچیده‌تری برای دسترسی اضافه کنید
50
+ # مثلاً بررسی اینکه کاربر درس را خریداری کرده یا در دوره ثبت نام کرده
51
+ return True
52
+
53
+ def can_edit_content(self, user_id, content_id):
54
+ """بررسی امکان ویرایش محتوا"""
55
+ current_role = getattr(request, 'user_role', 'student')
56
+ return current_role in ['instructor', 'admin']
57
+
58
+ # نمونه singleton
59
+ authz_manager = Authorization()
60
+
61
+ # دکوراتورهای سریع دسترسی
62
+ require_student = authz_manager.require_role('student')
63
+ require_instructor = authz_manager.require_role('instructor')
64
+ require_admin = authz_manager.require_role('admin')