Flask实战第37天:服务器权限验证
完成服务器权限验证之前,我们先如下页面先补上

帖子管理
{% extends 'cms/cms_base.html' %}
{% block title %}
帖子管理-CMS管理系统
{% endblock %}
{% block page_title %}
帖子管理
{% endblock %}
{% block main_content %}
这是帖子管理页面
{% endblock %}
cms_posts.html
评论管理
{% extends 'cms/cms_base.html' %}
{% block title %}
评论管理-CMS管理系统
{% endblock %}
{% block page_title %}
评论管理
{% endblock %}
{% block main_content %}
这是评论管理页面
{% endblock %}
cms_comments.html
板块管理
{% extends 'cms/cms_base.html' %}
{% block title %}
板块管理-CMS管理系统
{% endblock %}
{% block page_title %}
板块管理
{% endblock %}
{% block main_content %}
这是板块管理页面
{% endblock %}
cms_boards.html
前台用户管理
{% extends 'cms/cms_base.html' %}
{% block title %}
前台用户管理-CMS管理系统
{% endblock %}
{% block page_title %}
前台用户管理
{% endblock %}
{% block main_content %}
这是前台用户管理页面
{% endblock %}
cms_fusers.html
CMS用户管理
{% extends 'cms/cms_base.html' %}
{% block title %}
cms用户管理-CMS管理系统
{% endblock %}
{% block page_title %}
cms用户管理
{% endblock %}
{% block main_content %}
这是cms用户管理页面
{% endblock %}
cms_cusers.html
CMS组管理
{% extends 'cms/cms_base.html' %}
{% block title %}
CMS组管理-CMS管理系统
{% endblock %}
{% block page_title %}
CMS组管理
{% endblock %}
{% block main_content %}
这是CMS组管理页面
{% endblock %}
cms_roles.html
编辑cms.views.编写对应的视图函数
...
@bp.route('/posts/')
@login_required
def posts():
return render_template('cms/cms_posts.html') @bp.route('/comments/')
@login_required
def comments():
return render_template('cms/cms_comments.html') @bp.route('/boards/')
@login_required
def boards():
return render_template('cms/cms_boards.html') @bp.route('/fusers/')
@login_required
def fusers():
return render_template('cms/cms_fusers.html') @bp.route('/cusers/')
@login_required
def cusers():
return render_template('cms/cms_cusers.html')
cms.views
编辑cms_base.html,修改对应导航的url
...
{% if g.cms_user.has_permission(CMSPersmission.POSTER) %}
<li class="nav-group post-manage"><a href="{{ url_for('cms.posts') }}">帖子管理</a></li>
{% endif %} {% if g.cms_user.has_permission(CMSPersmission.COMMENTER) %}
<li class="comments-manage"><a href="{{ url_for('cms.comments') }}">评论管理</a></li>
{% endif %} {% if g.cms_user.has_permission(CMSPersmission.BOARDER) %}
<li class="board-manage"><a href="{{ url_for('cms.boards') }}">板块管理</a></li>
{% endif %} {% if g.cms_user.has_permission(CMSPersmission.FRONTUSER) %}
<li class="nav-group user-manage"><a href="{{ url_for('cms.fusers') }}">前台用户管理</a></li>
{% endif %} {% if g.cms_user.has_permission(CMSPersmission.CMSUSER) %}
<li class="nav-group cmsuser-manage"><a href="{{ url_for('cms.cusers') }}">CMS用户管理</a></li>
{% endif %} {% if g.cms_user.has_permission(CMSPersmission.ADMIN) %}
<li class="cmsrole-manage"><a href="{{ url_for('cms.croles') }}">CMS组管理</a></li>
{% endif %}
cms_base.html
现在点击各导航已经能够正确调到自己的页面了,但是有些导航样式并不是选中的状态

因为之前也提到过,这个选中状态是根据url 来匹配的,所以我们需要去修改cms_base.js
...
$(function () {
var url = window.location.href;
if(url.indexOf('profile') >= 0){
var profileLi = $('.profile-li');
profileLi.addClass('unfold').siblings().removeClass('unfold');
profileLi.children('.subnav').children().eq(0).addClass('active').siblings().removeClass('active');
} else if(url.indexOf('resetpwd') >= 0){
var profileLi = $('.profile-li');
profileLi.addClass('unfold').siblings().removeClass('unfold');
profileLi.children('.subnav').children().eq(1).addClass('active').siblings().removeClass('active');
} else if(url.indexOf('resetemail') >= 0){
var profileLi = $('.profile-li');
profileLi.addClass('unfold').siblings().removeClass('unfold');
profileLi.children('.subnav').children().eq(2).addClass('active').siblings().removeClass('active');
} else if(url.indexOf('posts') >= 0){
var postManageLi = $('.post-manage');
postManageLi.addClass('unfold').siblings().removeClass('unfold');
}else if(url.indexOf('boards') >= 0){
var boardManageLi = $('.board-manage');
boardManageLi.addClass('unfold').siblings().removeClass('unfold');
}else if(url.indexOf('fusers') >= 0){
var userManageLi = $('.user-manage');
userManageLi.addClass('unfold').siblings().removeClass('unfold');
}else if(url.indexOf('cusers') >= 0){
var cmsuserManageLi = $('.cmsuser-manage');
cmsuserManageLi.addClass('unfold').siblings().removeClass('unfold');
}else if(url.indexOf('croles') >= 0){
var cmsroleManageLi = $('.cmsrole-manage');
cmsroleManageLi.addClass('unfold').siblings().removeClass('unfold');
}else if(url.indexOf('comments') >= 0) {
var commentsManageLi = $('.comments-manage');
commentsManageLi.addClass('unfold').siblings().removeClass('unfold');
}
});
cms_base.js
服务端权限验证
之前我们完成了客户端的权限验证,就是不同的账号权限会显示不同的页面(没有权限的页面不会显示)。但是这样还不够。我们使用账号fw@qq.com来看看

因为fw@qq.com只有访问者的权限,所以只能查看到个人中心,但是,它依然能够根据url访问到他本没有权限访问的页面,如帖子管理

所以,只要用户登录后直接输入url ,就轻松绕过了权限这一块,为了解决这个问题,我们还需要在后端做验证
后端验证,我们可以和登录一样,通过装饰器来完成,然后对应的视图函数传入自己对应权限的参数。
就是需要一个传入参数的装饰器,编辑cms.decoratoras.py
...
def permission_required(permission):
def outter(func):
@wraps(func)
def inner(*args, **kwargs):
#判断该用户是否有权限
if g.cms_user.has_permission(permission):
return func(*args, **kwargs)
else:
#没有权限则返回到首页
return redirect(url_for('cms.index'))
return inner
return outter
最后,编辑user.views.py在视图函数中加入上面的装饰器,并传入对应的权限
....
@bp.route('/profile/')
@login_required
@permission_required(CMSPersmission.VISITOR) #这个装饰器要放在login_required下面,因为只有先登录了,才能进下一步验证,
def profile():
return render_template('cms/cms_profile.html') @bp.route('/posts/')
@login_required
@permission_required(CMSPersmission.POSTER)
def posts():
return render_template('cms/cms_posts.html') @bp.route('/comments/')
@login_required
@permission_required(CMSPersmission.COMMENTER)
def comments():
return render_template('cms/cms_comments.html') @bp.route('/boards/')
@login_required
@permission_required(CMSPersmission.BOARDER)
def boards():
return render_template('cms/cms_boards.html') @bp.route('/fusers/')
@login_required
@permission_required(CMSPersmission.FRONTUSER)
def fusers():
return render_template('cms/cms_fusers.html') @bp.route('/cusers/')
@login_required
@permission_required(CMSPersmission.CMSUSER)
def cusers():
return render_template('cms/cms_cusers.html') @bp.route('/croles/')
@login_required
@permission_required(CMSPersmission.ADMIN)
def croles():
return render_template('cms/cms_croles.html')
Flask实战第37天:服务器权限验证的更多相关文章
- 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 11 ...
- Springboot Oauth2 集成Swagger2权限验证实战
Swagger是什么?能干什么?在这就不展开讲解了.本文主要讲解如何集成OAuth2的Password模式权限验证,验证接口是否具有权限. 引入依赖 <dependency> <gr ...
- 【Rsync项目实战】备份全网服务器数据
[Rsync项目实战]备份全网服务器数据 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载,转 ...
- C# MVC权限验证
前言 之前一直没怎么接触过权限验证这块,刚好公司老平台改版,就有了这篇权限验证.此篇文章大致讲解下 精确到按钮级别的验证如何实现.以及权限验证设计的参考思路(菜鸟一枚,大神勿喷). 在开发大项目的时候 ...
- python装饰器 & flask 通过装饰器 实现 单点登录验证
首先介绍装饰器,以下是一段标注了特殊输出的代码.用于帮助理解装饰器的调用过程. import time def Decorator_one(arg1): info = "\033[1;31; ...
- Flask+Nginx+uWSGI在Ubuntu服务器上的配置
Flask+Nginx+uWSGI在Ubuntu服务器上的配置 Step1 安装系统环境 Ubuntu服务器选择是阿里云的ECS服务,ECS提供单独的内存\CPU\带宽\存储规格可以选择,并且提供合适 ...
- shopnc 支持 支付宝快捷登陆 shopnc权限验证原理说明
为目前使用的是shopnc商场二次开发,shopnc本身做了qq互联和微博快捷登陆的api,做成了集成通用的接口 首先说下基本的这种类型的api访问方式,首先,的有个配置文件,配置你申请的id和key ...
- NET MVC权限验证
ASP.NET MVC权限验证 封装类 写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一 ...
- Forms身份验证和基于Role的权限验证
Forms身份验证和基于Role的权限验证 从Membership到SimpleMembership再到ASP.NET Identity,ASP.NET每一次更换身份验证的组件,都让我更失望.Memb ...
随机推荐
- 2009 Round2 A Crazy Rows (模拟)
Problem You are given an N x N matrix with 0 and 1 values. You can swap any two adjacent rows of the ...
- linux系统引导流程
1.固件:硬件和软件结合.加电自检是我们按下电源会检测硬件像cpu.内存.网卡等信息.(从硬件层次检测硬件是否可用) 固件设置实例:设置时间 软件时间和硬件时间: [root@VM_0_12_cent ...
- linux编程之信号
信号(signal)机制是UNIX系统中最为古老的进程之间的通信机制,它用在一个或多个进程之间传递异步信号,信号可以由各种异步事件产生,如: 键盘中断等等,在Linux 的shell 中,也可以使用信 ...
- python基础===理解Class的一道题
解题如下: from random import randint class Die(): def __init__(self,sides=6): self.sides = sides def rol ...
- 流程控制--for序列
In []: list1 = [,,,] In []: for i in list1: ...: print i ...: In []: for i in list1: print i, ...: / ...
- Redis -- 数据类型小结
redis key 的命名规则: 对象类型:对象id:对象属性 (hset car:1: price 500.hset car:1: name:tom) 一.redis 数据类型: 1. 字符串类型 ...
- Windows下修改oracle实例不随服务自动启动
设置Oracle Administration Assistant for Windows 开始->所有程序->Oracle - OraDb10g_home1->配置和移植工具-&g ...
- hdu 1003(最大子段和)
Max Sum Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Sub ...
- h5游戏制作
前言: 好久没更新博客了,以前很多都不会,所以常常写博客总结,倒是现在有点点经验了就懒了.在过去的几个月里,在canvas游戏框架方面,撸过了CreateJS,玩得了Egret,又学过PIXI.js. ...
- Go语言表组测试示例
比基本测试多个循环... package main import ( "testing" "net/http" ) const checkMark = &quo ...