完成服务器权限验证之前,我们先如下页面先补上

帖子管理

{% 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天:服务器权限验证的更多相关文章

  1. 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 ...

  2. Springboot Oauth2 集成Swagger2权限验证实战

    Swagger是什么?能干什么?在这就不展开讲解了.本文主要讲解如何集成OAuth2的Password模式权限验证,验证接口是否具有权限. 引入依赖 <dependency> <gr ...

  3. 【Rsync项目实战】备份全网服务器数据

    [Rsync项目实战]备份全网服务器数据 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品,允许转载,转 ...

  4. C# MVC权限验证

    前言 之前一直没怎么接触过权限验证这块,刚好公司老平台改版,就有了这篇权限验证.此篇文章大致讲解下 精确到按钮级别的验证如何实现.以及权限验证设计的参考思路(菜鸟一枚,大神勿喷). 在开发大项目的时候 ...

  5. python装饰器 & flask 通过装饰器 实现 单点登录验证

    首先介绍装饰器,以下是一段标注了特殊输出的代码.用于帮助理解装饰器的调用过程. import time def Decorator_one(arg1): info = "\033[1;31; ...

  6. Flask+Nginx+uWSGI在Ubuntu服务器上的配置

    Flask+Nginx+uWSGI在Ubuntu服务器上的配置 Step1 安装系统环境 Ubuntu服务器选择是阿里云的ECS服务,ECS提供单独的内存\CPU\带宽\存储规格可以选择,并且提供合适 ...

  7. shopnc 支持 支付宝快捷登陆 shopnc权限验证原理说明

    为目前使用的是shopnc商场二次开发,shopnc本身做了qq互联和微博快捷登陆的api,做成了集成通用的接口 首先说下基本的这种类型的api访问方式,首先,的有个配置文件,配置你申请的id和key ...

  8. NET MVC权限验证

    ASP.NET MVC权限验证 封装类 写该权限类主要目地 为了让权限配置更加的灵活,可以根据SQL.json.或者XML的方式来动态进行页面的访问控制,以及没有权限的相关跳转. 使用步骤 1.要建一 ...

  9. Forms身份验证和基于Role的权限验证

    Forms身份验证和基于Role的权限验证 从Membership到SimpleMembership再到ASP.NET Identity,ASP.NET每一次更换身份验证的组件,都让我更失望.Memb ...

随机推荐

  1. Maven -- 在进行war打包时用正式环境的配置覆盖开发环境的配置

    我们的配置文件一般都放在  src/main/resource 目录下. 假定我们的正式环境配置放在 src/main/online-resource 目录下. 那么打成war包时,我们希望用onli ...

  2. 【Foreign】登山 [DP][数学]

    登山 Time Limit: 10 Sec  Memory Limit: 256 MB Description 恶梦是一个登山爱好者,今天他来到了黄山 俗话说的好,不走回头路.所以在黄山,你只能往前走 ...

  3. JS之document对象(找元素、操作内容、操作属性、操作样式及4道例题)

    document对象 一.找元素 1.根据id找 示例: <input id = "a" type="button" value="找元素&qu ...

  4. 大聊Python----通过Socket实现简单的ssh客户端

    光只是简单的发消息.收消息没意思,干点正事,可以做一个极简版的ssh,就是客户端连接上服务器后,让服务器执行命令,并返回结果给客户端. #ssh_client.py import socket cli ...

  5. JQuery-Ajax后台提交数据与获取数据 Java代码

    function jqajax(){ var urlName = $("#urlName").val(); var urla = $("#url").val() ...

  6. Windows下基于python3使用word2vec训练中文维基百科语料(三)

    对前两篇获取到的词向量模型进行使用: 代码如下: import gensim model = gensim.models.Word2Vec.load('wiki.zh.text.model') fla ...

  7. epoll内核源码分析

    转载:https://www.nowcoder.com/discuss/26226?type=0&order=0&pos=27&page=1 /*  *  fs/eventpo ...

  8. Linux 入门记录:八、Linux 文件系统

    一.文件系统 操作系统通过文件系统管理文件及数据,磁盘或分区需要创建文件系统之后,才能被操作系统所用,创建文件系统的过程又称之为格式化.没有文件系统的设备又称之为裸设备(raw),某些环境会需要裸设备 ...

  9. JS面试题第一弹

    1.javascript的typeof返回哪些数据类型  alert(typeof [1, 2]); //object     alert(typeof 'leipeng'); //string   ...

  10. 使用JMX工具远程监控tomcat配置

    使用JMX工具远程监控tomcat,在tomcat启动时添加配置参数: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.po ...