35、Flask实战第35天:权限设计
二进制及其相关运算
认识二进制
0,1,2,3,4,5,6,7,8,9,10:逢10进1
0,1:逢2进1
二进制转十进制
十进制 | 二进制 |
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
255 | 11111111 |
二进制之间的与(&)或(|)运算
与运算:0&1=0 1&1=1 相当于python if条件中的and
或运算:0|1=1 0|0=0 相当于Python if条件中的or
判断某个用户有没有某个权限(a)
只要将需要对比的用户的权限和a权限的二进制码进行与运算,如果得到的结果和a相等,那么就代表这个用户有a这个权限,否则代表没有
权限和角色模型定义
用户是和角色绑定,而不是直接拥有权限,通过角色拥有的权限,则该用户就拥有什么权限
一个用户可以同时拥有多个角色(如:运营和销售),一个角色也可以对应多个用户,因此用户和角色是多对多的关系
权限,这里直接用类固定写好。
配置模型,编辑cms.modles.py
定义一个权限的类
class CMSPersmission(object):
#255的二进制方式表示11111111
ALL_PERMISSION = 0b11111111
#访问者权限
VISITOR = 0b00000001
#管理帖子权限
POSTER = 0b00000010
#管理评论的权限
COMMENTER = 0b00000100
#管理板块的权限
BOARDER = 0b00001000
#管理前台用户的权限
FRONTUSER = 0b00010000
#管理后台用户的权限
CMSUSER = 0b00100000
#管理后台管理员的权限
ADMIN = 0b01000000
定义角色模型并且和CMSUser模型组成多对多的关系
cms_role_user = db.Table(
'cms_role_user',
db.Column('cms_role_id', db.Integer, db.ForeignKey('cms_role.id'), primary_key=True),
db.Column('cms_user_id', db.Integer, db.ForeignKey('cms_user.id'), primary_key=True)
) class CMSRole(db.Model):
__tablename__ = 'cms_role'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(50), nullable=False)
desc = db.Column(db.String(200), nullable=True)
create_time = db.Column(db.DateTime, default=datetime.now)
permissions = db.Column(db.Integer, default=CMSPersmission.VISITOR) users = db.relationship('CMSUser', secondary=cms_role_user, backref='roles')
编辑CMSUser模型,该用户拥有的权限,是否拥有某权限,是不是开发者(拥有所有权限)
class CMSUser(db.Model):
__tablename__ = 'cms_user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(50), nullable=False)
_password = db.Column(db.String(100), nullable=False)
email = db.Column(db.String(50), nullable=False, unique=True) #unique表示必须是唯一的
join_time = db.Column(db.DateTime, default=datetime.now) def __init__(self, username, password, email):
self.username = username
self.password = password
self.email = email @property
def password(self):
return self._password @password.setter
def password(self, raw_password):
self._password = generate_password_hash(raw_password) def check_password(self, raw_password):
result = check_password_hash(self.password, raw_password)
return result @property
def permissions(self):
# 如果该用户没有任何角色,则没有权限
if not self.roles:
return 0
#遍历该用户拥有的角色,获取该角色权限,并所有所含所有角色权限通过或运算组合在一起
all_permissions = 0
for role in self.roles:
permissions = role.permissions
all_permissions |= permissions
return all_permissions def has_permission(self, permission):
# 把传过来的权限和该用户所拥有的权限进行与运算,得出的结果和传过来的权限进行比较,一致的话则拥有该权限
# 0b00000011 & 0b00000001 ---->1 (0b00000001)
return self.permissions & permission == permission @property
def is_developer(self):
#判断该用户是否是开发者,开发者拥有所有权限
return self.has_permission(CMSPersmission.ALL_PERMISSION)
映射表到数据库
python manage.py db migrate
python manage.py db upgrade
创建角色,并把用户加入到角色
编辑manage.py
...
CMSRole = cms_models.CMSRole
CMSPermission = cms_models.CMSPersmission @manager.command
def create_role():
#访问者(可以修改个人信息)
visitor = CMSRole(name='访问者',desc='可以修改个人信息')
visitor.permissions = CMSPermission.VISITOR #运营角色(修改个人信息,管理帖子,管理评论,管理前台用户)
operator = CMSRole(name='运营', desc='管理帖子,评论,前台用户')
operator.permissions = (CMSPermission.VISITOR|
CMSPermission.POSTER|
CMSPermission.COMMENTER|
CMSPermission.FRONTUSER)
#管理员(拥有绝大部分权限)
admin = CMSRole(name='管理员', desc='拥有本系统所有权限')
admin.permissions = (CMSPermission.VISITOR|
CMSPermission.POSTER|
CMSPermission.COMMENTER|
CMSPermission.BOARDER|
CMSPermission.FRONTUSER|
CMSPermission.CMSUSER)
#开发者
developer = CMSRole(name='开发者', desc='开发人员专用')
developer.permissions = CMSPermission.ALL_PERMISSION db.session.add_all([visitor, operator, admin, developer])
db.session.commit() @manager.option('-e', '--email', dest='email')
@manager.option('-n', '--name', dest='nmae')
def add_user_to_rule(email, name):
user = CMSUser.query.filter_by(email=email).first()
if user:
role = CMSRole.query.filter_by(name=name).first()
if role:
role.users.append(user)
db.session.commit()
print('用户{}添加到角色{}成功'.format(email, name))
else:
print('没有这个角色:{}'.format(name))
else:
print('没有这个用户:{}'.format(email)) @manager.command
def test_permission():
user = CMSUser.query.first() #目前我数据库只有一个账号
if user.is_developer:
print('用户{}有开发者的权限'.format(user.email))
else:
print('用户{}没有开发权限'.format(user.email))
执行创建角色
python manage.py create_role
35、Flask实战第35天:权限设计的更多相关文章
- SpringSecurity权限管理系统实战—九、数据权限的配置
目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战-三 ...
- AppBox升级进行时 - 扁平化的权限设计
AppBox 是基于 FineUI 的通用权限管理框架,包括用户管理.职称管理.部门管理.角色管理.角色权限管理等模块. AppBox v2.0中的权限实现 AppBox v2.0中权限管理中涉及三个 ...
- 一个基于RBAC0的通用权限设计清单
注:RBAC0与RBAC1不同在于权限继承.关于RBAC1的权限设计,敬请关注作者后续CSDN博客.1,用户表 保存系统用户信息,如张三.李四,字段可以有id.name.fullname.email. ...
- ASP.NET MVC +EasyUI 权限设计(二)环境搭建
请注明转载地址:http://www.cnblogs.com/arhat 今天突然发现博客园出问题了,老魏使用了PC,手机,平板都访问博客园了,都是不能正常的访问,原因是不能加载CSS,也就是不能访问 ...
- ASP.NET MVC +EasyUI 权限设计(一)开篇
在前一段时间中,老魏的确非常的忙碌,Blog基本上没有更新了,非常的抱歉,那么在后面的时间中,老魏会尽量的抽时间来写的,可能时间上就不太富裕了.今天开始呢,老魏会和大家分享一下关于权限设计的有关文章, ...
- WisDom.Net 框架设计(五) 权限设计
WisDom.Net --权限设计 1.需求分析 基本在所有的管理系统中都离不开权限管理.可以这么说,权限管理是管理系统的核心所在. 权限管理说白一些就是每个人能够做什么,不能够做什么.可以说 ...
- JAVA 数据权限设计
数据权限设计 前言 在各种系统中.要保证数据对象的安全性以及易操作性,使企业的各业务部门.职能部门可以方便并且高效的协同工作,那么一个好的数据权限管理设计就成为一个关键的问题.尽管企业中各个单元的工作 ...
- ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计
原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(13)-权限设计 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇) (1):框架搭建 (2):数据 ...
- 权限设计实现(MVC4+Bootstrap+ PetaPoco+Spring.Net)
权限设计实现(MVC4+Bootstrap+ PetaPoco+Spring.Net) 一.前言 至毕业后一直在做企业Web开发,做过的项目也有不少,每个项目的框架设计都不是一样,但是每个项目的权限模 ...
随机推荐
- 地精排序Gnome Sort
号称最简单的排序算法,只有一层循环,默认情况下前进冒泡,一旦遇到冒泡的情况发生就往回冒,直到把这个数字放好为止 直接看它排序的过程,待排数组[6 2 4 1 5 9] 先设计一个标识i=0然后从头开始 ...
- HTML5实体刮刮乐效果!
先来看DEMO吧,http://codepen.io/jonechen/pen/ZOyxmq HTML部分: <div class="msg"> <a href= ...
- 多线程---iOS-Apple苹果官方文档翻译
本系列所有开发文档翻译链接地址:iOS7开发-Apple苹果iPhone开发Xcode官方文档翻译PDF下载地址(2013年12月29日更新版) 多线程 技术博客http://www.cnblo ...
- No 'Access-Control-Allow-Origin' Ajax跨域访问解决方案
No 'Access-Control-Allow-Origin' header is present on the requested resource. 当使用ajax访问远程服务器时,请求失败,浏 ...
- 【bzoj4765】普通计算姬
一道奇奇怪怪的数据结构题? 把树线性化,然后分块维护吧. 为了加速,求和用树状数组维护每个块的值. #include<bits/stdc++.h> #define N 100010 #de ...
- C高级 框架开发中红黑树结构
引言 -- 红黑树历史 红黑树是数据结构学习中一道卡. 底层库容器中必不可少的算法. 历经各种实战运用,性能有保障. 同样红黑树不好理解, 就算理解了, 代码也不好写. 就算写了, 工程库也难构建. ...
- Linux平台用C++实现事件对象,同步线程(转)
本文属于转载,原文链接如下:http://blog.csdn.net/chexlong/article/details/7080537 与其相关的一组API包括:pthread_mutex_init, ...
- scrapy框架搭建与第一个实例
scrapy是python的一个网络爬虫框架,关于它的介绍有很多资料,这里不做过多介绍(好吧我承认我还不是很懂...).我现在还在摸索阶段,因为用scrapy爬取的第一个网站非常简单,不涉及登陆.验证 ...
- Request对象与Response对象
1.Request对象 Request对象是来获取请求消息的,是由服务器(Tomcat)创建的. Request对象继承体系结构: ServletRequest -- 接口 ...
- 简单理解Hash算法的作用
什么是Hash Hash算法,简称散列算法,也成哈希算法(英译),是将一个大文件映射成一个小串字符.与指纹一样,就是以较短的信息来保证文件的唯一性的标志,这种标志与文件的每一个字节都相关,而且难以找到 ...