本文为大家讲解 Django 框架里自带的权限模型,从理论到实战演练,带领大家了解 Django 里权限是怎么一回事。
主要内容
什么是权限管理?
Web 权限
Django 权限机制
Django 的权限项
权限应用
什么是权限管理
Web 权限
在 Web 里权限管理是 Web 应用项目中比较关键的环节,因为浏览器是每一台计算机都已具备的,如果不建立权限管理系统,那么一个“非法用户”可以轻而易举通过浏览器访问Web应用项目中的所有功能。因此需要权限管理系统进行权限检测,让经过授权的用户可以正常合法的使用已授权的功能,而对那些未授权的非法用户拒之门外。 一个好的权限管理系统应该对每一类或每一个用户,分配不同的系统操作权限,并应具有扩展性,也就是它可以加入到任何一个带有权限管理的 Web 应用项目中,就像构件一样可以被重复使用。 同时,还要提醒开发者,开发一个 Web 应用项目时,应尽可能的将整个系统细化,分解为若干个子模块,最后组合成一个完整的应用。也只有这样,才容易实现为每一类或每一个用户分配不同的操作权限。
Django 权限机制
约束用户行为,控制页面的显示内容
,也能使 API 更加安全和灵活;用好权限机制,能让系统更加强大和健壮Django 的权限项
权限应用
Django 定义每个 model 后,默认都会添加该 model 的 add, change 和 delete三个 permission,自定义的 permission 可以在我们定义 model 时手动添加
class Server(models.Model):
...
class Meta:
permissions = (
("view_server", "can view server"),
("change_server_status", "Can change the status of server"),
)
◆ Permission(二)
User 对象的 user_permission 字段管理用户的权限 user = User.objects.get(username="rock") user.user_permissions = [permission_list] user.user_permissions.add(permission, permission, …) #增加权限 user.user_permissions.remove(permission, permission, …) #删除权限 user.user_permissions.clear() #清空权限 # 注:上面的 permission 为 django.contrib.auth.Permission 类型的实例
# 示例演示:
In [3]: from django.contrib.auth.models import User #导入用户模块
In [6]: user = User.objects.get(username="nick") #获取用户对象
In [7]: user.user_permissions.all() # 查看用户权限
Out[7]: []
In [8]: from django.contrib.auth.models import Permission #导入权限模块
In [10]: Permission.objects.get(pk=43) #获取权限信息
Out[10]: <Permission: dashboard | server | 访问服务器信息>
In [11]: Permission.objects.filter(pk=43) #获取权限信息(以列表形式输出)
Out[11]: [<Permission: dashboard | server | 访问服务器信息>]
In [12]: user.user_permissions = Permission.objects.filter(pk=43) #赋予用户权限(赋予权限不需要保存)
In [13]: user.user_permissions.all() #查看用户当前权限
Out[13]: [<Permission: dashboard | server | 访问服务器信息>]
In [18]: user.user_permissions.add(Permission.objects.get(pk=43)) #add添加权限(必须是一个Permission实例,否则报错)
In [40]: user.user_permissions.all()
Out[40]: [<Permission: dashboard | department | Can change department>, <Permission: dashboard | server | 访问服务器信息>]
In [41]: user.user_permissions.remove(Permission.objects.get(pk=43)) #remove移除权限(必须是一个Permission实例,否则报错)
In [42]: user.user_permissions.all()
Out[42]: [<Permission: dashboard | department | Can change department>]
◆ User Permission 管理(二)
myuser.has_perm(’dashboard.view_server')
has_perm() 方法的参数,即 permission 的 codename,但传递参数时需要加上 model 所属 app 的前缀,无论 permission 赋予 user 还是 group,has_perm()方法均适用
user.get_all_permissions()
user.get_group_permissions()
◆ Group Permission 管理
group permission 管理逻辑与 user permission 管理一致,group 中使用permissions 字段做权限管理: group.permissions = [permission_list] group.permissions.add(permission, permission, …) group.permissions.remove(permission, permission, …) group.permissions.clear()
在视图中验证权限
—— permission_requiredfrom django.contrib.auth.decorators import permission_required
@permission_required(’dashboard.view_server')
def my_view(request):
...
◆ 权限验证(二)
在类视图中验证
from django.utils.decorators import method_decorator
from django.contrib.auth.decorators import login_required, permission_required
class ServerView(TemplateView):
@method_decorator(login_required)
@method_decorator(permission_required(“dashboard.view_server”)
def get(self, request, *args, **kwargs):
……
◆ 权限验证(三)
views 中验证
if not request.user.has_perm(’dashboard.view_server')
return HttpResponse('Forbidden')
◆ 权限验证(四)
Template 中的权限检查
{% if perms.dashboard.view_server %}
有权限
{% endif %}
◆ 扩展阅读:
使用 Django 认证系统:http://python.usyiyi.cn/translate/django_182/topics/auth/default.html