首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Web开发之旅-用户权限实现

只要是多用户的系统,都涉及到用户权限的问题,比如网站后台只能管理员访问,某些资源只能特定的用户组才能访问,某些功能只能特定用户组才能使用,功能越丰富的网站需要更细粒度的权限控制。那我们的网站怎么来对用户的权限进行控制呢?

一、用户的权限

可以看到论坛的权限非常的多,但是一般个人博客网站不会使用这么多的权限,我们将权限进行简化来进行示范如何处理权限,以后大家可以根据自己的需求来实现用户的权限控制,梳理以下几种权限,然后每种权限使用二进制的标志位来进行赋值:

这里的标志位可以一直往上扩展,但是不能超过数据库存储的最大数字,mysql的bigint支持8字节,也就是64位,大多数情况下是足够的。

为什么要用二进制这种方法呢?这里就涉及到位操作了,python里面对于位操作很少有用到,但是在C语言中就非常频繁,但是python也支持位操作,例如按位与(&)和按位或(|):

这里就可以使用按位或来讲这些权限组合起来赋予某个角色,比如一个注册用户拥有前三个权限,协管员具有前四个权限:

那么如何来判定某个角色是否具备某种权限呢?使用按位于就可以了,比如判断注册用户是否拥有修改评论的权限:

这样就通过二进制的与和或实现了为角色添加权限和判定角色是否具备某种权限的能力。下面我们就在models.py中把权限封装成一个类:

接下来就是在角色模型中将这些权限组合后赋予角色。

二、用户的角色

1.在models.py中新建角色类

这个模型和在前面建的User模型的方法相同,db.Column表示字段,db.relationship表示关系,因为每个用户都有一个角色,所以Role这边就应该是多,而User那边为1,所以在User中使用外键即可。在User模型中添加一个外键:

2.给Role模型添加静态方法:

这个静态方法的目的是在同步数据库后,往roles这张表填入内容,roles字典定义了角色名称及其对应的权限,这里权限用的是|来计算的,元组的第二项是布尔值,表示该角色是否为用户默认的角色,for循环中是将roles字典中的内容插入到表中,插入前会先判断是否存在,不存在就新建,已存在就修改。

3.用户注册时自动为用户添加角色:

这个是添加在User模型中的__init__方法,首先判断新建用户时是否指定了role,如果没有指定就判断用户名是否和config中的FLASK_ADMIN一致,如果一致就将用户的角色设置成管理员,如果不一致就设置成默认角色。

4.为User添加两个判断权限的方法

第一个can方法是判断用户是否具有某种权限,这里用的是按位与(&),第二个方法是判断用户是否是管理员。

接下来就是将权限应用在页面上实现对用户访问的控制。

三、权限的使用

对于装饰器控制用户访问我们并不陌生,在用户登录认证时我们使用过login_required这个装饰器来限制登录用户访问,同样可以采用这种方式,首先自定义两个装饰器,在app文件夹下新建一个decorators.py:

装饰器在python中使用非常的广泛,对于装饰器的写法和用法是必须掌握的基本功,后面会单独写一篇装饰器的文章,接下来就是将装饰器用在视图函数上。

vv/app/main/views.py:

四、匿名用户

前面在User中实现了can和is_administraor方法,但是如果用户不登录,调用这两个方法就是无效的,所以要对匿名用户进行处理,flask_login扩展中提供了匿名用户的混合类,将它继承后实现这两个方法,然后将它赋值给login_manager.anonymous_user即可。

models.py:

使用AnonymousUserMixin前从flask_login中先import。然后在extensions.py中设置:

extensions.py:

这样匿名用户也可以使用权限判断方法了。

用户权限也是一个网站或者应用服务的核心模块之一,对于大型应用权限的设计极为复杂,首先需要厘清用户需要哪些权限,然后对用户的角色进行设计,最后是对用户访问的路由进行权限控制。

关注一下可好?

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180926G0PU4400?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券