赞
踩
欢迎关注,回复关键词:面试题
知识清单
1.了解基于资源的权限管理方式
2. 掌握权限数据模型
3. 掌握基于url的权限管理(不使用权限框架的情况下实现权限管理)
权限管理原理知识
什么是权限管理
只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制。按照安全规则或安全策略控制用户可以访问而且只能访问自己被授权的资源。
权限管理包括用户认证和用户授权两部分。
用户认证
用户认证概念
用户认证—— 用户去访问系统,系统需要验证用户身份的合法性。最常用的用户身份认证方法:1.用户密码方式、2.指纹打卡机、3.基于证书的验证方法。系统验证用户身份合法,用户方可访问系统的资源。
用户认证流程
关键对象
subject:主体,理解为用户,可能是程序,都要去访问系统的资源,系统需要对subject进行身份认证。
principal:身份信息,通常是唯一的,一个主体可以有多个身份信息,但是只能有一个主身份信息(primary principal)。
credential:凭证信息,可以是密码、证书、指纹等。
总结:主体在进行身份认证时需要提供身份信息和凭证信息。
用户授权
用户授权概念
用户授权,简单理解为访问控制,在用户认证通过后,系统对用户访问资源进行控制,当用户具有资源的访问权限方可访问。
授权流程
其中橙色为授权流程
关键对象
授权的过程可以理解为 who 对 what(which) 进行how操作
who:主体,即subject,subject在认证通过后,系统进行访问控制。
what(which):资源(Resource) ,subject必须具备资源访问权限才可以访问该资源。资源包括很多方面比如:用户列表页面、商品修改菜单、商品id为001的商品信息。
资源分为资源类型和资源实例:
例如系统的用户信息就是资源类型,相当于Java类。
系统中id为001的用户就是资源实例,相当于new的Java对象。
how:权限/许可(permission),针对资源的权限或许可,subject必须具有permission方可访问资源,如何访问/操作需要定义permission,权限比如:用户添加、用户添加、商品删除。
权限模型
主体(账号、密码)
资源(资源名称,访问地址)
权限(权限名称、资源id)
角色(角色名称)
角色和权限关系(角色id、权限id)
如下图:
通常企业开发中将资源和权限合并为一张权限表,如下:
资源(资源名称、访问地址)
权限(权限名称、资源id)
合并为:
权限(权限名称、资源名称、资源访问地址)
上图被称为权限管理的通用模型,不过在企业开发中根据系统自身特点还会对上图进行修改,但是用户、角色、权限、用户角色关系、角色权限关系是必不可少的。
分配权限
用户需要分配相应的权限才可以访问相应的资源。权限是对资源的操作许可。
通常给用户分配资源权限需要将权限信息持久化,比如存储在关系数据库中。
把用户信息、权限管理、用户分配的权限信息写入到数据库(权限数据模型)。
权限控制(授权核心)
基于角色的访问控制
RBAC (Role based access control) 基于角色的访问控制
比如:
系统角色包括:部门经理、总经理…(角色针对用户进行划分)
基本流程:
#注意下面这是版本一
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'web.apps.WebConfig',
'rbac.apps.RbacConfig',
]
from django.db import models class Menu(models.Model): """ 菜单表 一级菜单 """ title = models.CharField(max_length=32) icon = models.CharField(max_length=64, null=True, blank=True, verbose_name='图标') # 默认值为1 weight = models.IntegerField(default=1, verbose_name='显示权重') def __str__(self): return self.title class Permission(models.Model): """ 权限表 可以做二级菜单的权限 menu 关联 菜单表 不可以做菜单的权限 menu=null """ url = models.CharField(max_length=32, verbose_name='权限') title = models.CharField(max_length=32, verbose_name='标题') menu = models.ForeignKey('Menu', null=True, blank=True) # 自己关联自己 parent = models.ForeignKey('self', null=True, blank=True) # 写法二 # parent = models.ForeignKey('Permission', null=True, blank=True) name = models.CharField(max_length=32, verbose_name='URL别名') class Meta: verbose_name_plural = '权限' verbose_name = '权限' def __str__(self): return self.title class Role(models.Model): """ 角色表 """ name = models.CharField(max_length=32, verbose_name='名称') permissions = models.ManyToManyField('Permission', verbose_name='角色拥有的权限', blank=True) def __str__(self): return self.name class User(models.Model): """ 用户表 """ name = models.CharField(max_length=32, verbose_name='名称') password = models.CharField(max_length=32, verbose_name='密码') roles = models.ManyToManyField('Role', verbose_name='用户拥有的角色', blank=True) def __str__(self): return self.name
执行数据库的迁移
python manage.py makemigrations
python manage.py migrate
在admin中注册后台可显示的 和可编辑的字段(利用django强大的后台)
from django.contrib import admin from rbac import models class PermissionModelAdmin(admin.ModelAdmin): list_display = ['title', 'url', 'menu', 'parent', 'name'] # 展示的字段 list_editable = ['url', 'menu', 'parent', 'name'] # 编辑的字段 class MenuModelAdmin(admin.ModelAdmin): list_display = ['title', 'icon', 'weight'] # 展示的字段 list_editable = ['icon', 'weight'] # 编辑的字段 admin.site.register(models.Permission, PermissionModelAdmin) admin.site.register(models.Role) admin.site.register(models.User) admin.site.register(models.Menu, MenuModelAdmin)
创建超级管理员用户
python manage.py createsuperuser
当然 我们也可以配置显示为中文的后台
在settings文件中
# LANGUAGE_CODE = 'en-us'
LANGUAGE_CODE = 'zh-hans'
# TIME_ZONE = 'UTC'
TIME_ZONE = 'Asia/Shanghai'
这样就可以显示为中文的后台的了
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。