Flask 实现rbac 权限控制

RBAC原理:

RBAC(Role-Based Access Control,基于角色的访问控制),就是用户通过角色与权限进行关联。简单地说,一个用户拥有若干角色,每一个角色拥有若干权限。这样,就构造成“用户-角色-权限”的授权模型。在这种模型中,用户与角色之间,角色与权限之间,一般者是多对多的关系

Flask实现RBAC:

  • 流程图
    flask 生成菜单使用 @app.first_request 装饰器
    判断是否拥有该菜单的权限使用@app.before_reuqest 装饰器
    一个用户拥有的权限通过 用户组的公共权限 + 用户的私有权限 拼接而成。举例说明:
    当创建一个A用户的时候,默认情况这个用户属于guest用户组。而guest用户组只拥有浏览index和list的权限。则用户A的权限为[index,list]。如果管理员想让用户A访问项目详情页而又不想更改guest的权限。则对用户A赋予私有权限[detail] 这个时候,用户A的访问权限则为[index,list,detail]

  • 数据库表结构设计
    ** user表

create table user(
   id INT NOT NULL AUTO_INCREMENT,
   name VARCHAR(100) NOT NULL,
   password VARCHAR(100) NOT NULL,
   mail VARCHAR(40) NOT NULL,
   menu_arr VARCHAR(40) NOT NULL,
   group_id INT,
   date DATE,
   PRIMARY KEY ( id )
); 

** group表

create table group(
   id INT NOT NULL AUTO_INCREMENT,
   name VARCHAR(100) NOT NULL,
   menu_arr VARCHAR(40) NOT NULL,
   date DATE,
   PRIMARY KEY ( id )
); 

** menu 表

create table user_to_group(
    id INT NOT NULL AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    link VARCHAR(100) NOT NULL,
    parent_id VARCHAR(100) NOT NULL,
    menu_type VARCHAR(100) NOT NULL,
    ico VARCHAR(100) NOT NULL,
    default VARCHAR(100) NOT NULL,
    PRIMARY KEY ( id )
); 
  • Flask代码
def create_menu(user_id):
    q_user = user.select(user.group_id,user.menu_arr).where(user.id == user_id).get() #查询用户私有权限及组ID
    q_group = group.select(group.menu_arr).where(group.id == q_user.group_id).get() # 根据组ID查询用户组权限
    menu_arr = (q_user.menu_arr + q_group.menu_arr).split(',') #用户私有权限与组公共权限进行合并
    menu = menu.select().where(menu.id << menu_arr) #根据用户所拥有的权限,查询菜单列表

# 验证权限    
@app.before_reuqest
def check_auth():
    menu_list = create_menu()
    if request.path not in menu_list:
        return render_template(500.html), 500
未经允许不得转载:99ya » Flask 实现rbac 权限控制