1、关于用户权限的几种情况举例:

python 用户管理 python用户权限管理_python 用户管理

python 用户管理 python用户权限管理_python 用户管理_02

2、解决思路:

明确一点我们还是要使用@auth.login_required@auth.verify_password,因为这样可以把接口不公开暴露

我们可以把权限信息写入到token令牌中

我们可以把A、B、C、D看做是表,可以写到mysql、redis或者就写到我们的代码里。其实最好是把这种对应关系做成配置文件的形式。

python 用户管理 python用户权限管理_作用域_03

那么,我们先给作用域起名字,超级管理员叫做SuperScpoe、管理员叫AdminScope、普通用户叫UserScope

首先在生产令牌的时候要写入权限作用域,然后携带访问的时候我们才可以把它的权限作用域读取出来,从而去具体的表里去执行查询操作。

我们在验证令牌的函数@auth.verify_password中拿到当前请求的request请求所访问的视图函数

当前请求要访问哪个视图函数,视图函数在我们的flask中是可以用endpoint来表示的。我们使用request.endpoint就可以拿到当前这个请求要访问的视图函数

python 用户管理 python用户权限管理_python 用户管理_04

我们先说一下401和403,401在http中代表的是授权失败,403代表的是禁止访问权限不够,这两个的意义是不同的,授权失败可能是账号密码不匹配,但是403是权限不够或者就是不让访问。

关键问题:

python 用户管理 python用户权限管理_字符串_05

下图是我们单独编写的用来做用户权限控制的模块

python 用户管理 python用户权限管理_python 用户管理_06

我们以为scope是UserScope具体的一个对象,但是仅仅是一个名字,而且里面是字符串。

如何通过一个类的名字得到一个类的对象呢?我们现在涉及到一个动态创建对象的需求,scope()是不行的,在java里面叫反射,但是在反射这个名词在我们python里面不常用到。

python里面有一个函数叫做globals,它可以帮我们实现,我们先看一下globals的调用结果

python 用户管理 python用户权限管理_python 用户管理_07

python 用户管理 python用户权限管理_用户权限控制思路_08

可以看到首先是一个字典,里面有很多的内置变量作为键,我们最关注的就是AdminScop和UserScope

可以看到UserScope的键是一个字符串,值就是class UserScope

globals会把当前模块下所有的变量包括在这里面编写的各种各样的类都变成一个字典,所以看下图这么写就拿到一个对象了。

python 用户管理 python用户权限管理_字符串_09

到此就结束了,因为我们在@auth.verify_password修饰的函数里面已经完成了权限的控制,如果权限满足就继续往后面走,如果权限不满足就抛出异常。

3、解决代码臃肿问题并实现链式连加操作

python 用户管理 python用户权限管理_字符串_10

通过上图可以看到有很多的重复的视图函数名放到allow_api中,所以如果项目很大,这样很繁琐。

我们可以把UserScope的allow_api合并到SuperScope的allow_api中

python 用户管理 python用户权限管理_python_11

现在就已经把UserScope的allow_api合并到SuperScope的allow_api里面了

如果我们在想合并UserScope呢就在加一个.add()????但是现在是不支持这种链式的add的

python 用户管理 python用户权限管理_python_12

上图的写法会报错

python 用户管理 python用户权限管理_用户权限控制思路_13

因为我们第一次调用self.add之后我们add方法的内部没有返回任何的东西,所以说是self.add(UserScope())调用的结果是None。

None是没有后续的add操作的,所以我们只需要在add中把我们的self给返回回来。

python 用户管理 python用户权限管理_python_14

python 用户管理 python用户权限管理_python 用户管理_15

4、add方法定义优化

我们把add方法定义在SuperScope里面合理么?岂不是只有SuperScope才支持这种相加的操作?

假如我们的AdminScope也要有这种相加的操作,所以我们不应该写到具体的方法中,而是定义一个基类。

下面我们定义如下基类

python 用户管理 python用户权限管理_python_16

然后我们来测试一下AdminScope

python 用户管理 python用户权限管理_用户权限控制思路_17

python 用户管理 python用户权限管理_作用域_18

然后我们发现打印了两次!

python 用户管理 python用户权限管理_python_19

所以我们最后要去重的

python 用户管理 python用户权限管理_python 用户管理_20

5、变成+的形式--------运算符重载

python 用户管理 python用户权限管理_用户权限控制思路_21

我们要实现上图红框所示采用+号的形式,因为我们发现python内置的数据类型是可以使用+号的,例如我们把两个列表合并在一起可以使用+号。那么我们可不可以把我们自己定义的两个对象用+合并在一起呢?可以的!我们要使用到运算符重载

我们只需要把基类的add前后加两个下划线就行了。然后别的类换成+号就行啦

python 用户管理 python用户权限管理_作用域_22

python 用户管理 python用户权限管理_作用域_23

6、

批量导入模块下所有的视图函数