Skip to content

Commit 60902f4

Browse files
committed
docs: create permissions page
1 parent 67ffad7 commit 60902f4

File tree

5 files changed

+204
-3
lines changed

5 files changed

+204
-3
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
commit 67ffad744371c275a3ed28809861063b606cf52f
2+
Author: alexeev-prog <[email protected]>
3+
Date: Sat Nov 23 19:36:20 2024 +0700
4+
5+
Update Changelog
6+
17
commit b508da83b02db558deab7c7c4bca59fa3545a046
28
Author: alexeev-prog <[email protected]>
39
Date: Sat Nov 23 19:35:45 2024 +0700

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ Welcome to **EchoNext**, where innovation meets simplicity! Are you tired of the
4141

4242
**Imagine** a lightweight framework that empowers you to create modern web applications with lightning speed and flexibility. With EchoNext, you're not just coding; you're building a masterpiece!
4343

44-
> Last unstable version: 0.6.9 alpha
45-
> Last stable version: 0.5.9 alpha
44+
> Last stable version: 0.6.9 alpha
4645
4746
> Next Big Update: ASYNC & unicorn support
4847
@@ -771,6 +770,7 @@ Extended documentation and framework specifications are available at the followi
771770
5. [Request/Response](./docs/en/requests_responses.md)
772771
6. [Localization i18n/l10n](./docs/en/i18n_locales.md)
773772
7. [Security](./docs/en/security.md)
773+
8. [Permissions & rights](./docs/en/permissions.md)
774774

775775
### Russian / Русский
776776

@@ -781,6 +781,7 @@ Extended documentation and framework specifications are available at the followi
781781
5. [Request/Response](./docs/ru/requests_responses.md)
782782
6. [Локализация i18n/l10n](./docs/ru/i18n_locales.md)
783783
7. [Безопасность](./docs/ru/security.md)
784+
8. [Разрешения и права](./docs/ru/permissions.md)
784785

785786
## 💬 Support
786787
If you encounter any issues or have questions about pyEchoNext, please:

docs/en/permissions.md

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# pyEchoNext / Permissions and Rights
2+
3+
---
4+
5+
in pyEchoNext you can create an additional layer of abstraction, in the form of policies, permissions, roles. For example, this way you can create user and administrator roles, introduce restrictions, and much more.
6+
7+
The `pyechonext.permissions` module is responsible for this. It has the following classes:
8+
9+
+ Permission - permission,
10+
+ Role - a role,
11+
+ Resource - a resource,
12+
+ AccessControlRule - access control rule,
13+
+ Policy - policy,
14+
+ AttributeBasedPolicy - attribute restriction policy,
15+
+ AgeRestrictionsABP - age attribute restriction policy,
16+
+ User - user,
17+
+ DefaultPermissionChecker - rights checking class,
18+
+ UserController - user controller
19+
20+
Usage example:
21+
22+
```python
23+
from pyechonext.permissions import (
24+
Permission,
25+
Role,
26+
Resource,
27+
AccessControlRule,
28+
Policy,
29+
AgeRestrictionsABP,
30+
User,
31+
DefaultPermissionChecker,
32+
UserController,
33+
)
34+
35+
view_users_perm = Permission("view_users")
36+
edit_users_perm = Permission("edit_users")
37+
38+
admin_role = Role("admin")
39+
admin_role.add_permission(view_users_perm)
40+
admin_role.add_permission(edit_users_perm)
41+
42+
user_role = Role("user")
43+
user_role.add_permission(view_users_perm)
44+
45+
user_resource = Resource("UserResource")
46+
47+
policy = Policy()
48+
policy.add_rule(AccessControlRule(admin_role, view_users_perm, user_resource, True))
49+
policy.add_rule(AccessControlRule(admin_role, edit_users_perm, user_resource, True))
50+
policy.add_rule(AccessControlRule(user_role, view_users_perm, user_resource, True))
51+
policy.add_rule(AccessControlRule(user_role, edit_users_perm, user_resource, False))
52+
53+
age_policy = AgeRestrictionsABP(conditions={"age": 18}, rules=policy.rules)
54+
age_policy.add_rule(AccessControlRule(user_role, view_users_perm, user_resource, True))
55+
56+
admin_user = User("admin", attributes={"age": 30})
57+
admin_user.add_role(admin_role)
58+
59+
young_user = User("john_doe", attributes={"age": 17})
60+
young_user.add_role(user_role)
61+
62+
permission_checker = DefaultPermissionChecker(policy)
63+
user_controller = UserController(permission_checker)
64+
65+
66+
def test_controller():
67+
"""Test Controller"""
68+
assert user_controller.view_users(admin_user, user_resource) == (
69+
"200 OK",
70+
"User edit form",
71+
)
72+
assert user_controller.edit_users(admin_user, user_resource) == (
73+
"200 OK",
74+
"User edit form",
75+
)
76+
assert user_controller.edit_users(young_user, user_resource) == (
77+
"403 Forbidden",
78+
"You do not have permission to edit users.",
79+
)
80+
81+
82+
def test_age_policy():
83+
"""Test Age Policy"""
84+
assert age_policy.evaluate(young_user, user_resource, view_users_perm) == False
85+
assert age_policy.evaluate(admin_user, user_resource, view_users_perm) == True
86+
87+
88+
test_controller()
89+
test_age_policy()
90+
```
91+
92+
---
93+
94+
[Contents](./index.md)
95+
96+
97+

docs/ru/permissions.md

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# pyEchoNext / Разрешения и права
2+
3+
---
4+
5+
в pyEchoNext вы можете создать дополнительный слой абстракции, в виде политик, разрешений, ролей. Например, так можно создавать роли пользователей, администраторов, вводить ограничения и многое другое.
6+
7+
За это отвечает модуль `pyechonext.permissions`. Он имеет следующие классы:
8+
9+
+ Permission - разрешение,
10+
+ Role - роль,
11+
+ Resource - ресурс,
12+
+ AccessControlRule - правило контроля доступа,
13+
+ Policy - политика,
14+
+ AttributeBasedPolicy - политика ограничения по атрибутам,
15+
+ AgeRestrictionsABP - политика ограничения по атрибуту возраста,
16+
+ User - пользователь,
17+
+ DefaultPermissionChecker - класс проверки прав,
18+
+ UserController - контроллер пользователей
19+
20+
Пример использования:
21+
22+
```python
23+
from pyechonext.permissions import (
24+
Permission,
25+
Role,
26+
Resource,
27+
AccessControlRule,
28+
Policy,
29+
AgeRestrictionsABP,
30+
User,
31+
DefaultPermissionChecker,
32+
UserController,
33+
)
34+
35+
view_users_perm = Permission("view_users")
36+
edit_users_perm = Permission("edit_users")
37+
38+
admin_role = Role("admin")
39+
admin_role.add_permission(view_users_perm)
40+
admin_role.add_permission(edit_users_perm)
41+
42+
user_role = Role("user")
43+
user_role.add_permission(view_users_perm)
44+
45+
user_resource = Resource("UserResource")
46+
47+
policy = Policy()
48+
policy.add_rule(AccessControlRule(admin_role, view_users_perm, user_resource, True))
49+
policy.add_rule(AccessControlRule(admin_role, edit_users_perm, user_resource, True))
50+
policy.add_rule(AccessControlRule(user_role, view_users_perm, user_resource, True))
51+
policy.add_rule(AccessControlRule(user_role, edit_users_perm, user_resource, False))
52+
53+
age_policy = AgeRestrictionsABP(conditions={"age": 18}, rules=policy.rules)
54+
age_policy.add_rule(AccessControlRule(user_role, view_users_perm, user_resource, True))
55+
56+
admin_user = User("admin", attributes={"age": 30})
57+
admin_user.add_role(admin_role)
58+
59+
young_user = User("john_doe", attributes={"age": 17})
60+
young_user.add_role(user_role)
61+
62+
permission_checker = DefaultPermissionChecker(policy)
63+
user_controller = UserController(permission_checker)
64+
65+
66+
def test_controller():
67+
"""Test Controller"""
68+
assert user_controller.view_users(admin_user, user_resource) == (
69+
"200 OK",
70+
"User edit form",
71+
)
72+
assert user_controller.edit_users(admin_user, user_resource) == (
73+
"200 OK",
74+
"User edit form",
75+
)
76+
assert user_controller.edit_users(young_user, user_resource) == (
77+
"403 Forbidden",
78+
"You do not have permission to edit users.",
79+
)
80+
81+
82+
def test_age_policy():
83+
"""Test Age Policy"""
84+
assert age_policy.evaluate(young_user, user_resource, view_users_perm) == False
85+
assert age_policy.evaluate(admin_user, user_resource, view_users_perm) == True
86+
87+
88+
test_controller()
89+
test_age_policy()
90+
```
91+
92+
---
93+
94+
[Содержание](./index.md)
95+
96+
97+

pyechonext/app.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ def _serve_static_file(
307307
:returns: response
308308
:rtype: Response
309309
"""
310-
print(f"Serve sttic file by path: {request.path}")
310+
print(f"Serve static file by path: {request.path}")
311311
response.content_type = self.static_files_manager.get_file_type(request.path)
312312
response.body = self.static_files_manager.serve_static_file(
313313
_prepare_url(request.path)

0 commit comments

Comments
 (0)