精华内容
下载资源
问答
  • 第三章城市智慧交通管理和服务平台系统方案设计 3.1系统构成 按照信息获取的方式、传递及使用情况,可以把城市智慧交通管理和服务综合信息服务平台系统划分为4 个层次: 基础层、功能层、共享信息层和服务层。在...

    第三章城市智慧交通管理和服务平台系统方案设计

    3.1系统构成

    按照信息获取的方式、传递及使用情况,可以把城市智慧交通管理和服务综合信息服务平台系统划分为4 个层次: 基础层、功能层、共享信息层和服务层。在指挥中心建设一个基于GIS的综合信息服务平台,通过整合集成各个子系统,达到可视化智能管理与控制和管理决策辅助支持,实现常态下的日常综合交通管理和违章执法,以及面向事件的联动控制和应急处置。

    城市智慧交通管理和服务综合信息服务平台系统结构如图1所示。

    3.2 基础层的主要功能

     基础层主要包括各种交通信息的获取和为了信息传递而建立的通信网络。基础层要保证获得的交通信息准确可靠,通信网络能及时、准确地传递交通信息。交通信息由动态交通信息和静态交通信息组成。静态交通信息是指基础的交通设施,例如道路及其附属设施、道路的标志与标线等。道路附近的标志性建筑如汽车站和火车站等也是影响局部交通状况的重要因素,这些也要归入静态的交通信息。动态的交通信息主要是指布设在道路上的交通状态监测设施所取得的数据和通过人工方式采集的路况信息。现在常用的交通状态监测设备主要包括视频流量监视器、环形线圈检测器、微波车辆检测器、视频车辆检测器等。配有GPS和通信设备的交通管理人员也是动态交通路况信息的来源之一。通信网络不仅包含采集、传递交通信息的网络 设备,还包括与出行者进行信息交流的通信设备如广播、电话等设备。目前国内外通常采用的通信形式与网络结构包括:

    (1)局域网、广域网(光纤宽带、DDN 、ISDN 等) 、系统内专网(信息中心与分中心之间以及路测单元与分中心间)、公众信息服务网等。

    (2)手机短信、调频副载波通信、其他移动通信设备等,用于交通信息发布。

    (3)电话、手机、传真、有线电视(CATV )、Internet等,用于交通信息查询。

    (4)支持各种物理链路,如卫星、光纤、无线、有线电视等,以数字通信为主。

    动态和静态的交通信息以地理信息系统(GIS,Geography Information System )为可视化平台,通过网络设备为其他各层提供服务。

    3.3 功能层的主要功能

     功能层是基于基础层的信息能够提供的各种功能的全集,完善的服务功能简化了交通管理者的劳动,为出行者设计出行方案提供了有效的帮助。功能层主要包括信号控制、运行车辆管理、电子收费、紧急事件处理、交通信息管理与发布系统、车载导航定位系统等。自适应信号控制系统被认为实用性最强,是发展智能交通管理系统的最佳选择。自适应信号控制系统的主要内容包括中心管理的动态控制策略,交叉口自适应控制,建立行人、车辆和非机动车控制的模型等方面。交通信息管理与发布系统通过对动态交通信息的采集、传输、处理和发布,在地理信息系统上提供实时的可视化道路和交通状况,并通过多种传媒为商业运输企业、政府机构和普通公众提供实时的和预测性的交通信息服务。随着无线通信方式的发展,通过手机或其他手持设备、移动终端等上网获得路况信息,重新设计预定的出行方案将会是近期内诱导系统的主要部分。

    3.4 共享信息层的主要功能

    共享信息层是指由功能层各部件综合集成所构成的城市智能交通综合信息服务平台,它将从功能层中采集到的各种交通信息进行融合分析与加工处理后,为上层各种服务所共享,并为交警、交通、公安地等系统的跨系统联动提供依据及预案。共享信息层主要是以地理信息系统平台作为支撑工具,为实现交通管制措施、设计交通运输方案、道路的规划与设计等提供有力的帮助。

    3.5 服务层的主要功能

    服务层是整个系统的最高层,是系统与出行者和交通管理者实现交互的接口。系统通过服务层向道路的控制设备提供控制方案,向出行者提供路况信息,向交通管理者分配管理任务;同时服务层也负责从出行者和管理者接收信息,如交通事故的报警、交通管理者提供的路段信息等;通过服务层还可以根据出行者提出的要求来提供最佳的出行方案。通过广播、交通网站、信号灯、诱导大屏等多种方式给出行者提供交通信息,尽可能的保证道路畅通,提高整个交通系统的效率。

    第四章智慧交通管理和服务平台系统集成解决方案

     

     

    城市智慧交通管理和服务综合信息服务平台系统组成及各子系统接口图如下:

    智慧交通管理和服务平台系统采用模块化结构,系统提供数据采集、数据处理、数据分析、数据挖掘、接口转换及信息服务、决策支持、系统预案、跨系统联动等功能,可集成智能公交系统、快速公交系统(BRT)、智能交通监控指挥系统、交通事件检测系统、城市交通诱导系统、交通信号控制系统、停车场管理系统等子系统模块,同时为高速公路、高速铁路、轻轨、物流、航运、出租等系统预留接口,并可与公安、医疗、能源、部队等实现信息共享及跨系统联动。

    下面将对智慧交通管理和服务平台中,可集成的各子系统解决方案做一下介绍:

     

    4.1智能公交系统解决方案

    4.1.1软件智能公交系统简介

    软件智能公交系统主要由车载主机设备与智能调度软件两部分组成。
           车载主机设备具备车辆自动报站、录像存储、多路视频监控与双向通话联络等功能;智能调度软件具备运营计划管理、智能调度、车辆实时监控、基础信息管理等功能。通过车载主机设备与智能调度软件协调工作,使调度工作降低运营成本,并完善了面向乘客的服务质量,提高了服务水平。

    智能公交系统逻辑结构图如下:

    智能公交系统物理结构图如下:

     

    软件智能公交系统智能调度软件主要组成:

    软件智能公交系统车载设备主要组成:

     

    4.1.2软件智能调度软件系统简介

    智能调度软件主要由调度平台与服务器组成,通过调度平台与服务器端的信息交互,调度平台与运营车辆和站台的相互联络,实现对站台信息发布与运营车辆调度工作的智能控制。
    调度平台工作在公交公司监控中心服务器上,实现计划管理、智能调度、实时监控等功能。

    调度平台登陆界面:

     

    调度平台工作界面:

     

     

    1、基础信息管理:

    调度平台中保存了公交公司各分公司、线路、车辆、人员等各项基础信息,这些基础信息与公交公司各条线路的运营息息相关,通过编辑、增加、删除相关基础信息,可以对公交公司各项工作做出及时的调整。

    2、行车计划管理:

    对于公交的运营来说,每日的行车计划是使之正常运营的基础,调度平台具备定制行车时刻表、行车班次等计划,通过对以上计划的设置、编辑、管理、可以有效的、准确的控制公交各条线路的正常运行,保证公交公司一切业务运转正常。

    3、劳动排班

    调度平台为公交公司提供了劳动排班功能,可以按日为各条线路安排每班司机,为了使系统操作更为简便、人性化,调度平台提供了早、晚班对换、班次顺延等辅助功能,为排班人员提供最大的便利。

    4、车辆监控

    调度平台提供了车辆监控功能,操作人员可以利用两种不同的方式对在线车辆进行监控工作:

    (1)模拟线路:

    系统提供模拟线路界面,工作人员通过该界面可以清晰的了解到各条线路的运营情况,界面按照线路运行方向依次排列每一个站台名称,工作人员可以在界面上了解每条线路上正在运营的车辆(车号)、车辆数量等信息;

    (2)地图监控:

    系统提供地图监控界面,车辆在线路上的运营将实时的显示在地图上,通过此功能,工作人员可以清晰的观察到车辆所处的路段;

    通过模拟线路与地图监控的配合,工作人员可以充分的了解线路的运营情况。

    5、运营统计

    调度平台提供了线路日报、月报、司机考核等一系列报表统计,实现报表输出的自动化、无纸化。

    6、视频监控

    系统提供了多路视频监控功能,工作人员可以通过视频监控功能实时监控车辆运营状况,系统支持同时监控四路摄像头,可以对不同线路的不同车辆同时监控,保证了监控中心的监控力度与覆盖面积。

    前端车载图像信息由车载摄像机完成采集,图像本地存储的同时通过无线网络也实时传送到监控中心,这样通过授权的客户端软件工作人员不仅可以看到公交车辆上的图像,配合电子地图还可以了解车辆所在的具体路段、方位、有无报警等状况,做到远程监控、报警联网、智能调度。

    4.2快速公交(BRT)智能系统解决方案

    4.2.1智能公交系统构成

    智能公交系统由通信网络系统、车辆定位和无线通信系统、运营调度系统、乘客信息系统、视频监视系统及周界防范系统组成。

    BRT智能系统逻辑结构如下:

     

     

    BRT智能系统物理结构如下:

     

    4.2.3智能公交系统功能

    智能公交系统应实现中心智能化调度管理、车站车上导乘信息发布、视频监视及夜间对车站的防护等功能。我公司BRT智能系统解决方案是建立在BRT基本特征之上的现代化、智能化运营管理系统。

    BRT基本特征是:路—专用路权;车—新型公交车;票—站台售检票;一站式封闭站台;运—面向乘客需求的线路运营组织;控—智能化运营管理系统。我公司BRT智能系统解决方案是建立在BRT基本特征之上的现代化、智能化运营管理系统。

    BRT智能系统主要功能:

    (1)满足BRT运营所需的“业务-资金-信息”三位一体的现代化业务要求,实现高效运营、优质服务、规范管理;

    (2)采用先进的技术手段对BRT车辆进行实时动态定位,对场站进行实时视频监控,为实时调度优化提供客观依据;

    (3)运用计算机优化编制运营作业计划和劳动派班计划,同时结合动态监控、现场采集与人员反馈获得的数据,利用计算机辅助实现实时调度;

    (4)根据BRT的运营特性,实现BRT车辆自动识别,对其进行相对的、有条件的路口信号优先,并选择适当的优先策略、优先方法和优先模式,减少其路口延误时间;

    (5)建立集成高效、综合利用的通信传输网络,满足智能系统多媒体信息传输、业务调度、实时监控的需要;

    (6)建立先进的、符合BRT运营管理要求和运行需要的售检票系统,为乘客提供快捷、方便的服务;

    (7)通过各种途径,为广大出行者提供实时、准确、便捷、高效的信息服务,改善公交形象,提高服务水平;

    (8)通过系统集成,使“车—路—站”成为一个有机整体,以提高BRT的运营效率和管理水平。

     

    4.3智能交通监控指挥系统解决方案

    4.3.1系统概述

    智能交通监控指挥系统作为智能交通系统的一个组成部分,在保证城市交通安全、畅通方面发挥着巨大的作用。可以作为了解交通状况和治安状况的一个窗口,是交通、公安指挥系统不可缺少的子系统。建立视频图像监控系统目的就是及时准确地掌握所监视路口、路段周围的车辆、行人的流量、交通治安情况等。

    交通视频监控的区域主要是城区主要道路,重点是交通流量大的路口、路段和事故多发点,所有监控视频信息全部送往监控中心,这一特点决定了交通视频监控网络为点对多点分散型网络结构,各点距离监控中心的距离有近有远,远点长达十几公里到几十公里。

    该系统由前段数据采集系统、数据传输系统、数据显示及存储和控制系统三级系统组成,系统具有高性能、多方面的检测手段,直观的数字检测和显示功能,图像监视功能,完善的紧急电话报警功能,以及能及时、动态地发布警示和诱导信息。

    4.3.2系统结构

    智能交通综合监控系统结构图如下:

     

    系统拓扑图:

     

    4.3.3系统特点

    1、交通监视和疏导

    通过系统将监视区域内的现场图像传回指挥中心,使管理人员直接掌握车辆排队、堵塞、信号灯等交通状况,及时调整信号配时或通过其他手段来疏导交通,改变交通流的分布,以达到缓解交通堵塞的目的。

    2、交通警卫

    管理人员随时掌握交通警卫录像,大型集会活动的交通状况,及时调动警力,以保证交通警卫录像畅通。

    3、视频存储取证

    本系统通过硬盘录像机进行视频录像存储,通过突发事件的录像,提高处置突发事件的能力。通过对违章行为的录像,发挥监控系统在经济效益和社会效益方面的积极作用。

    4、远程监控指挥

    通过对全线的监控,配合相应的广播、报警联动系统实现监控指挥中心或监控分中心对道路现场的全程监控管理。

     5  高清监控效果

    (1)系统采用日夜型长焦镜头,搭配透雾摄像机、激光器、红外热成像设备(可选),无论白天、晚上、雾天,都可对目标进行全天候昼夜监控。

    (2)先进的H.264图像处理技术,图像分辨率可设置为CIF:352*288、H-D1 704*288或D1:704*576,通过图像优化,消除了图像画面抖动和运动物体锯齿化和拖尾现象。

    (3)系统提供前端云台摄像机的控制功能,可根据用户权限提供优先级控制,提高系统自适效率。    

    (4)图像可根据现场情况叠加文字,日期,时间和特殊标志,便于录像检索。    

    (5)本系统通过多级联网模式,可对片区、监控分中心、监控指挥中心进行分级联网,集中监控。 

    4.3.4系统组成

     1、视频监控前端

    监控前端主要由长焦大镜头、云台、透雾摄像机、红外热成像(可选)、激光器、防雷组件,无间断电源等主要设备组成。每路视频在网络中占用的带宽低,同时,经过特殊算法处理的画质看起来更加清晰,细腻。适合交通行业对图像高清晰,高实时性的特殊要求。

    2、通讯网络

    道路视频监控系统采用标准的TCP/IP协议,可直接运行在交通部门的内部网上。前端监控一体机的视频信号利用视频编码器通过网络传输到分中心,在分中心可以监控存储,也可直接传输到监控指挥中心。

    3、监控中心

    监控系统采CS结构,在监控中心安装解码器、视频监控系统服务器,主要完成现场图像接收,用户登录管理,控制信号的协调,图像的实时监控,录像的存储、检索、回放、备份、恢复等。

    在监控中心,视频监控系统服务器将数字视频还原成模拟图像,将视频信号转到指挥中心电视墙上,指挥调动人员还可以选择以操作台微机作为监控终端,对全部路面信息集中调用监控。局领导利用计算机信息网上的任何一台微机/笔记本电脑当作监控客户端,利用客户端浏览器即可随时随地依据权限查看到所需要的画面。可实现多画面实时监控,远程控制摄像机云台、和违章抓拍等操作,是一套可满足交通实时图像监控的综合网络监控系统。

    4.4交通事件检测系统解决方案

    4.4.1系统简介

    交通事件检测系统(Traffic Incident Detection Systems),是一种完全智能化的视频分析系统,事件检测分析仪能对上传的视频图像、交通流数据、气象数据等进行分析,对图像中的一个或多个全景中的车辆行为进行检测和跟踪,从而实现对各种交通事件包括交通拥堵、车辆突然停驶(交通事故)、车辆逆行、车辆遗洒物品、行人穿越公路等交通特殊事件的可靠检测,实现对道路每车道车流量、平均车速、车道占有率、车间距、排队长度等交通流数据的准确分析及预警,以及道路能见度、温度、湿度等气象数据、烟雾火灾等特殊事件的准确分析及预警。交通事件检测系统能对交通状况进行分析、判断和处理,并将分析结果发送给交通管理和服务平台系统软件进行处理,交通事件检测系统还能为平台系统应用软件提供交通事件的性质、级别等相关信息,经监控人员确认后,将信息传达给急救、路政、交警等相关部门,以便能够及时处理交通事故,保证公路的安全、畅通,以及人民群众的生命财产安全。软件交通事件监测系统具有准确、精良的事件检测及分析能力,可为多系统联动提供报警信息及报警依据。

    4.4.2系统优势

    1.先进的视频触发技术、目标识别与跟踪技术

    系统采用先进的视频触发技术和国际领先的多目标识别与跟踪技术,能够实现24小时全天候检测,最大程度抑制了光照变化、阴影、雨雪等各种因素对精度的影响。

    2.建设成本低,节约资源

    3.系统稳定可靠

    4.4.3系统功能

    一.事件检测

    1.交通事故 

    2.突然停车

    3.车辆慢行

    4.车辆逆行

    5.行人穿越

    6.遗洒物

    7.隧道烟雾

    8.火灾

    9.车辆突然驶出路面

    10.道路突发异常

    二.流量检测

    1.车流量

    2.平均车速

    3.车道占有率

    4.车间距

    三、气象信息检测

    1.能见度检测

    2.雾检测

    3.雪天和积雪检测

    4.雨天和积水检测

    5.路面结冰检测

    四.事件报警和图像存储功能

    五.自诊断报警功能

    4.5城市交通诱导系统解决方案

    4.5.1系统概述

    交通诱导系统主要用于发布交通诱导信息和交通相关信息,将实时交通信息发布给参与者。系统通过采用先进的控制技术和室外信息显示技术及设备,以公安交通管理业务的基本规定为依据,对调节道路交通流量,提高现有道路通行能力,缓解交通阻塞将产生积极作用。

    4.5.2系统结构

    交通诱导显示屏系统由室外显示屏、指挥中心控制系统、通讯系统等部分组成。

     

    4.5.3系统功能

    一.多方式信息发布

    通用信息显示,人工诱导显示,自动诱导显示。

    二.信息发布内容

    1.前方主要路段、立交桥之间的预计旅行时间;(定量)

    2.前方道路拥挤状态;(定性)

    3.平均车速(包括每一车道);(定量)

    4.用车辆数(距离)表示的排队长度(定量)

    5.限定车辆最高速度信息(可变限速标志);(定量)

    6.意外事件或事故发展状况的信息;

    7.道路修建信息;

    8.当前推荐可选路线信息;

    9.重要地区停车状况信息;

    10当前或马上就要发生的对交通有影响的事件(如游行、足球比赛散场)信息;

    11.天气状况信息;

    12.交通管制情况的信息;

    13.交通法规、交通安全等宣传信息;

    三.交通诱导信息实时显示

    四.本地存储功能

    五.远程控制功能

    4.5.4系统性能

    1.显示屏为完全户外使用环境,设计和提供的系统及所有设备均能够在实际的使用环境中每天24小时连续运行。

    2.技术先进,主要设备(显示屏、控制机、通讯设备等)均能保证10年的正常使用寿命。

    4.6交通信号控制系统解决方案

    4.6.1系统简介

    交通信号控制系统是城市交通管理系统的一个重要子系统,其主要功能是自动调整控制区域内的配时方案,均衡路网内交通流运行,使停车次数、延误时间及环境污染等减至最小,充分发挥道路系统的交通效益,系统能够根据检测到的交通信息实时优化计算控制区域的控制方案,使其适应交通流的变化,满足车辆通行的需求,系统也可通过指挥中心人工干预,疏导交通。

    4.6.2系统优势

    1.完善的仿真和辅助决策功能;

    2.分子区的区域、线协调控制;

    3.多种绿波控制方式;

    4.交通流量数据的格式化存储和统计分析;

    5.多种特勤控制预案,确保特勤万无一失;

    6.无线遥控式信号机手动接口;

    7.系统良好的兼容性。

    4.6.3系统基本功能

    1.数据采集存储

    2.数据统计分析

    3.集中监控功能

    4.各分控制系统之间的联动控制功能

    5.设备监视和故障统计功能

    6.交通流量数据的格式化存储和统计分析功能

    7.用户管理和容量访问

    8.信号机参数管理功能

    9.交通仿真和辅助决策功能

    10.路口信号配时功能

    11.路口、路段和子区编辑功能

    12.子区划分

    4.6.4区域控制级功能

    1.远程遥控功能

    2.完全自适应

    3.交通拥挤点的提示与警告

    4.区域协调自适应控制

    5.动态方案选择控制

    6.线协调控制

    7.行人控制

    8.紧急车辆优先控制

    9.快速路出入口控制

    10.强制控制

    11.警卫路线设定功能 

     

    4.7智能停车场管理系统解决方案

    4.7.1系统简介

    伴随着城市智能化管理的提高,网络信息化的普及及人们生活方式的转变,特别是城市车辆保有量的快速增长、城市停车位资源的紧张,大型停车场的智能化管理将在许多大、中型城市中被推广使用。智慧交通管理和服务平台系统可集成停车场智能管理系统模块,通过监控中心的系统平台及跨系统合作,监控人员可远程实时监控被监控停车场的运行状态,实时了解停车场的运行情况、车位情况等,用户也可通过网站、电话、手机短信等方式查看、了解停车场的运行情况及车位情况等相关信息。

    停车场收费管理系统利用了高度自动化的机电和微机设备对停车场进行安全、有效的管理,包括收费、保安、监控、防盗等。本系统专门针对机场、车站、体育场馆、商场等公共场所停车场,或高级商住楼、高档写字楼与高级公寓与酒店的停车场进行监控及管理,对机动车辆进行识别与计费,是一种较好地将读感识别技术、大规模集成技术与计算机技术结合于一体的新型保安管理系统。它利用读感技术对持卡驾驶员进行自动遥测识别,通过挡车闸与专门软件技术的配合,给停车场的保安与计费管理提供了自动化手段与商业监督。该系统技术先进,操作简单,可靠性与保密性高,是目前最现代化的停车场智能管理控制系统。
      根据使用对象的不同,停车场可以划分为内部停车场和公用停车场两大类。内部停车场主要面向固定的车主,一般多用于各单位自用停车场、公寓及住宅小区配套停车场、写字楼及办公楼的地下车库等。这类停车场的特点是使用者固定,禁止外部车使用,使用者对设施使用的时间长,对车场管理的安全性要求严格,在上下班高峰期出入密度较大,对停车场设备的可靠性及处理速度要求较高。公用停车场主要为临时性散客提供服务,有收费和免费之分。这类停车场常见于大型公共场所,如车站、机场、体育场馆等地方。车场设施使用者通常是临时一次性使用者,数量多、时间短。要求车场管理系统运营成本低廉,使用简便,设备牢固可靠,可满足收费等商业处理要求。鉴于以上特点,停车场管理系统是为既有内部车辆又有临时收费车辆的综合停车场而设计,系统的设计具有模块化功能,这样,对于具体工程的项目而言,方案选择,可根据楼宇的档次、车辆的多少、车库出入口的数量、车库的性质、固定车辆与临时车辆的比例、费用支出的多少等因素,综合考虑各子系统的增减,灵活方便。

    4.7.2系统组成

    智能停车场管理系统由摄像机等视频监控系统、语音提示系统、对讲系统、入口读卡器及发卡机、出口读卡器、自动道闸、感应线圈、工控机、服务器、控制管理软件等系统等组成。

    4.7.3系统主要功能

    1.系统将用户分为两种,一种为固定用户,一种为临时用户。固定用户采取提前缴费方式(一个月、三个月、六个月或一年),每次出场时不再收费。临时用户出场时根据本次停车时间及当前费率缴费一次。

    2.所有车辆凭卡进入,读卡时间、地点及车辆等各项资料均自动在计算机上显示并记录。

    3.所有车辆刷卡后经收费员收费(临时用户)或确认(固定用户)后车辆出场。

    4.可任意设置通行时间及报警时间,如遇特殊情况还可定时设定编程。

    5.该系统具有分级管理功能,且人员操作该系统均有记录。

    6.卡片管理功能详尽。

    7.上述功能计算机均自动记录,出入报告、卡片报告、报警报告均可打印。

    8.本系统采用最先进的地感线圈技术控制挡车臂的落下。在电动挡车臂臂处安装地感线圈,当车辆进入读卡范围时由司机读卡,系统自行判定其为或无效,有效时电动挡车臂抬起,车辆进入地感线圈感应范围时,由地感线圈自行判定车辆是否行驶过去(有效范围内),若车辆未通过则电动挡车臂不落下,车辆通过后(有效范围内)则电动挡车臂落下,完成本次任务。如有车辆尾随进入则由地感线圈输出信号使电动挡车臂不落下。只有当车辆通过出入口,并且驶过预定的安全距离,挡车杠才会落下,从而确保了车辆的安全通过。

    4.7.4系统特点

    ——非接触式遥控识别:本系统提供非接触遥控识别。根据读感器的不同规格,提供不同的识别距离,普通读感器可提供20cm的读感距离,特殊读感器可提供50cm以上的读感距离。

    ——识别速度快:读感响应时间可达94mS。

    ——可靠性高,容易安装:读感器全封闭设计,密封率高,符合国际IP65标准,极难伪造。 非接触式智能卡由集成芯片构成,为无源卡。 系统完全电子化,设备占地小,不易损坏,后期施工。

    ——使用方便快捷:可根据变化环境自动定标,读感器发出的信号能透过非金属物体进行读感。

    ——系统灵活开放:系统可灵活地与其它设备连接,控制诸如门、闸、灯光、警报或摄像机等,系统软件可方便地按用户要求更改,更可联入楼宇网络。

    ——后台管理完善:强大的后台管理系统可以全面追踪所发行的每张卡的使用情况和各车辆的出入情况。中文界面,易懂易学,能自动计费并生成统计报表。

    ——可声光报警。

     


    关注我的技术公众号,每个工作日都有优质技术文章推送和电子版方案下载。

    微信扫一扫下方二维码即可关注:


     

    展开全文
  • 基于角色管理系统访问控制

    千次阅读 2013-10-09 14:08:03
    安全管理:计算机技术安全管理的范围很广,可以包括网络安全性、数据安全性、操作系统安全性以及应用程序安全性等。很多方面的安全性管理大都已经有成熟的产品了,我们只需根据自己需要有选择性的使用就可达到自己的...

    引言(Introduction)

    1.1. 关键词定义(Definitions)

    有关定义说明如下:

    安全管理:计算机技术安全管理的范围很广,可以包括网络安全性、数据安全性、操作系统安全性以及应用程序安全性等。很多方面的安全性管理大都已经有成熟的产品了,我们只需根据自己需要有选择性的使用就可达到自己的目的了。本文中有关关涉及"安全管理"一词均只针对本公司推出的应用中有关对象与数据而言范围有限。

    主体:即可以象应用系统发出应用请求任何实体,包括各种用户、其它与本系统有接口的应用程序、非法入侵者。系统必须具有识别主体的能力,接口实际上也是由用户登记的,故主要问题是校验用户身份的合法性,系统应建立用户鉴别机构以验证用户身份。

    用户:用户就是一个可以独立访问计算机系统中的数据或者用数据表示的其它资源的主体,我们用USERS表示一个用户集合。用户在一般情况下是指人。

    权限:权限是对计算机系统中的数据或者用数据表示的其它资源进行访问的许可。我们用PERMISSION表示一个权限集合。可分为对象访问控制和数据访问控制两种。

    对象访问控制:用一个二元组来表示:(控制对象,访问类型)。其中的控制对象表示系统中一切需要进行访问控制的资源。我们将引入一套完整的资源表示方法来对系统中出现的各类资源进行定义和引用(详见后述)。访问类型是指对于相应的受控对象的访问控制,如:读取、修改、删除等等。

    数据访问控制:如果不对数据访问加以控制,系统的安全性是得不到保证的,容易发生数据泄密事件。所以在权限中必须对对象可访问的数据进行按不同的等级给予加密保护。我们同样用一个二元组来表示:(控制对象,谓词)。

    权限最终可以组合成如下形式:(控制对象,访问类型,谓词)。

    角色:角色是指一个组织或任务中的工作或位置,它代表了一种资格、权利和责任。我们用ROLES表示一个角色集合。

    用户委派:用户委派是USERS与ROLES之间的一个二元关系,我们用(u,r)来表示用户u被委派了一个角色r。

    权限配置:权限配置是ROLES与PERMISSION之间的一个二元关系,我们用(r,p)来表示角色r拥有一个权限p。

     

    需求分析

    根据我们在本行业多年积累下来的经验,参考了其它同行的成功经验整合了先进的思想,我们有能力为我们自己的应用系统开发一套功能完善而且又灵活方便的安全管理系统。使开发人员从权限管理重复劳动的负担中解放出来,专心致力于应用程序的功能上的开发。 通过收集公司从事MIS项目开发经验丰富的软件工程师对在各种情况下的对应系统的安性提出的需求做出了如下的总结。

    本系统在安全管理方面要考虑如下几个方面问题。

    2.1. 角色与用户

    需求: 
    角色由用户(这个用户与下一行的"用户"应该不是同一个定义,"客户"好像合适一些?不错,此处的用户确是有些偏于指向我们合同意义的客户,但是我认为与下面定义的"用户"不存在什么本质上的区别,因为客户最终也是以在系统中登记的用户身份来使用本系统,用户所能完成的功能也就是客户的需求。两者之间的细微区别读者可自己通过上下文加区分)自行定义,根据业务岗位不同可以定义多个角色。

    登录系统,首先需要向系统申请注册,同一个用户只能在系统中登记一次。

    用户是登录系统的楔子,角色是用户权限的基础。用户可以扮演多个角色。

    将某一角色授予某一用户时,权限不能超越该角色权限,但可以小于该角色权限。

    用户口令与数据库访问口令加密

    分析说明

    • 每个用户在系统中由一个唯的USERID标识。
    • 用户通过系统登录界面登录系统,系统通过加密算法验证用户身份和判断用户是否已经登录系统。如果登录成功通知Application preference service和安全管理系统保存用户登录信息。
    • 角色由用户根据自己的设想的组织机构进行添加设置,提供一个专门的模块用来设置组织机构,用户通过组织机构(定义?部门机构还是后面提到的"机构是实现和执行各种策略的功能的集合")方便地进行角色管理。例如:用户可以通过部门机构来进行角色的管理,部门采用编号分层的方式,编号的每两位为一个层次。例如一级部门编号为两位,二级部门编号为四位依此类推下去直到将全厂部门机构建立树状结构图。这类数据仅为方便用户管理角色而存在,在系统的其他方面不存在任何意义。
    • 每个角色在系统中也是由一个唯一角色编号来标识,同时必须保存用户所设置的机构信息,一般来说每个角色只需要保存自己所在机构的代码即可。

    2.2. 菜单控制

    需求 
    此菜单乃系统业务功能菜单。由业务功能模块列表和用户菜单定制共同组成。每个用户可以拥有自己的菜单,也可以直接采用角色缺省菜单(当用户同时充当多个角色并且权限重复时,重复的权限仅一次有效)

    分析说明

    • 为了方便用户进行权限组织管理,需要在系统中建立一张业务功能模块列表,在用户界面上表示为树状分层结构。
    • 业务功能模块以用户定制菜单来体现,仍然采用编号分层方式,编号的每两位为一个层次。并标明一个层次是子菜单还是业务模块,子菜单只有一种可否被访问的权限设置,业务模块权限由系统管理员或授权用户进行设置。对每个业务模块设置它的对象控制、记录增删改控制和记录集控制。当用户拥有对业务模块的某一权限时,必需对处于它上级的子菜单有可被访问的权限。删除某一个级子菜单时将提示用户他的下级菜单与功能模块都将被删除掉。
    • 当用户同时充当多个角色并且权限重复时,重复的权限仅一次有效,用户拥有他充当的所有角色的权限的并集。
    • 用户与角色拥有的系统权限查询时以业务功能模块列表的树状结构显示出来。

    2.3. 对象控制

    需求 
    对象是指应用系统窗口中的可视对象,如菜单项、按钮、下拉列表框、数据编辑控件及数据编辑控件的字段等。对象控制通过角色与用户授权来实现。

    对象控制包括对对象属性的控制可对数据编辑控件中的数据记录的维护权限:

    • 对象属性:使能/禁止、可视/屏蔽
    • 记录维护:增加、删除、修改的组合

    分析说明

    • 将每个业务模块可进行属性设置的对象由程序员事先设定或由售后技术支持工程师指导用户加入。
    • 在系统管理员或授权用户进行设置业务模块的每种权限时,设置用户在拥有该业务模块这种权限时的对象属性。没有设置属性的对象在保存对象信息的时候,用户权限信息中不被保存。

    2.4. 记录集控制

    需求 
    记录集的控制是通过条件设置来实现,因此,需要控制记录集的数据库表需要设置专门的记录集筛选字段,而筛选条件由用户根据岗位自进定义,建立过滤表,统一管理。

    分析说明

    1. 在对用户设置业务模块权限时,同时在过滤表中设置本模块的数据编辑控件的数据筛选条件,筛选条件是组成SQL语句的WHERE条件子句迫使当前访问的模块根据筛选条件对数据编辑控件的SQL语句进行重组,并检索数据。
    2. 当存在需要从数据库中多个表取数据的情况时,过滤表中存在多条记录,每一条记录记录一个数据编辑控件取数的筛选条件。
    3. SQL语句的WHERE子句的生成与校验可以通过的SQL语法分析服务,利用对象所提供的函数分析SQL语句,截取WHERE条件子句,校验新组合的SQL语句的合法性。

    2.5. 权限分布管理

    需求 
    上述提到的权限管理内容应该满足既可集中管理,也可分散管理的目标。

    分析说明

    1. 权限管理由系统管理员集中管理,系统管理员工作负担过大,难对所有岗位的分工有全面和具体的了解,对权限作出标准细致的划分,对于大型的管理系统适合于把一部分设置权限的交由一些比较高级的用户来进行,有利于各岗位细致协调的工作。这就是权限的分散管理。
    2. 要实现权限的分散管理,就须对授权模块进行一些授权管理,这要求整个系统的授权安全管理工作要做到细致,不要出现权限的漏洞使一些高级用户拥有过大的权限。
     

    方案设计

    3.1. 安全保护策略

    从上面各方面的需求分析来看,我们需要一套既行之有效,又方便灵活的安全管理方案。要采用各种控制机构和密码保护技术。安全保护策略是设计安全可靠系统的准则,通常涉及下列几个方面:

    1. 区分安全策略与安全机构。
    2. 策略是信息安全性的高级指导,策略出自对用户要求,设备环境、机构规则、法律约束等方面的详细研究。策略重要性在于指导作用。而机构是实现和执行各种策略的功能的集合。完善的机构是实施正确安全策略的物质基础。故一般要求机构能实现不同的策略,以便策略变动时无需要更换安全机构。

    3. 安全策略:企业信息管理系统是一个大型的分布式数据资源管理系统,它包括信息量巨大以及不同程度的信息敏感度,各种有访问需求的用户,使得其安全管理非常复杂。基于角色的系统安全控制模型是目前国际上流行的先进的安全管理控制方法。我们的安全管理系统也根据自身的需要有选择性的吸收其部分思想。其特点是通过分配和取消角色来完成用户权限的授予和取消,并且提供了角色分配规则和操作检查规则。安全管理人员根据需要定义各种角色,并设置合适的访问权限,而用户根据其责任和资历再被指派为不同的角色。这样,整个访问控制过程就分成两个部分,即访问权限与角色相关联,角色再与用户关联,从而实现了用户与访问权限的逻辑分离,如下图所示,角色可以看成是一个表达访问控控制策略的语义结构,它可以表示承担特定工作的资格。


       

      由于实现了用户与访问权限的逻辑分离,基于角色的策略极大的方便了权限管理。例如,如果一个用户的职位发生变化,只要将用户当前的角色去掉,加入代表新职务或新任务的角色即可。研究表明,角色/权限之间的变化比角色/用户关系之间的变化相对要慢得多,并且委派用户到角色不需要很多技术,可以由行政管理人员来执行,而配置权限到角色的工作比较复杂,需要一定的技术,可以由专门的技术人员来承担,但是不给他们委派用户的权限,这与现实中情况正好一致。除了方便权限管理之外,基于角色的访问控制方法还可以很好的地描述角色层次关系,实现最少权限原则和职责分离的原则。 
    4. 安全保护机构:本系统的安全保护机构基本上是于上面的安全策略相互适应的,系统保护的总体结构示意如下: 
       
      保护机构应负责阻止一切物理破坏和用户可能的操作破坏,后者归结为主体可用何种方式访问哪些对象。主体、访问类型、对象是我们要讨论的保护机构主要成分 
    5. 安全管理的职责:安全管理有集中管理与分散管理两种。前者意指一切权利都由负责系统安全工作的专职人员或小组组掌握,他(们)决定用户的访问权利,控制系统安全一切方面。后者是指不同的管理员控制着系统安全的不同方面,管理系统的不同部分,决定不同用户的访问权利,甚至允许对象所有者转让访问对象的权利,集中管理,安全可靠但不灵活;分散管理则应考虑避免漏洞和协调一致的问题。本系统因是针对大的集团企业管理的产品权限分配比较复杂,故采用了集中管理与分散管理相结合的形式。
    6. 访问控制策略。它提供决定用户访问权利的依据。其中最重要的一个普遍的原则是"需者方知策略"(the need-to-know)。也就是说,只有一个工作需要的,才是他应该知道的。它从原则上限制了用户不必要的访问权利,从而堵截了许多破坏与泄露数据信息的途经。按照这一原则授予用户的权利,是用户能完成工作的最小权利集合,故也称之为"最少特权策略"。
    7. 信息流动控制。只限制用户的访问权利而不考虑数据流动是极其危险的。例如,在考勤时各部门的主管只能为自己部门的职员考勤,人事部可以提取全部数据,因此在提取数据时一定要加以限制。控制数据流动以防止无权用户在数据流动后获得访问权利。
    8. 密码变换。对于非常机密数据可变换为密码存贮,使得不知道密码的入侵者无法破译所得到的数据密码。密码变换能防止泄密,但不能保护数据信息不被破坏。
    9. 软硬结合保护。这是安全保护的基本策略,许多硬保护功能是软件难以实现的,有些即使能实现,效率也不高。
    10. 对安全遭到破坏的响应。各种保护机构都有可能遭到破坏,因此系统必须制订检测破坏手段与处置措施。

    3.2. 安全管理机构分析

    3.2.1. 功能框架示意图


    • 内部总体功能框架图
       

    • 外调用的功能框架示意图
       

    3.2.2. 主要功能组件的职责 
    3.2.2.1. 对象定义工具与权限定义工具

    1. 对象定义工具。 
      对象是指系统中各种功能模块、数据、界面元素(包括菜单、按钮等各种界面上能控制的控件)等,它们是主体能访问的各种对象。由于对象的机密程度不等,受到的保护程度亦有差别。系统中的对象均由程序员通过系统提供的对象定义工具事先定义好系统要控制的对象。系统也只能控制这些事先已定义好的对象,因此,对象定义是整个系统的核心步骤直接影响后面的各个安全控制环节。建议由开发程序员进行初始化配置。对象定义的包括如下几步:
      • 功能模块定义:系统中除部分公用的界面、公用功能模块外,其它均为业务功能模块是用户完成各自不同的业务功能的主要算途径,也是我们安全管理要保护的重点对象,所以我们必须对业务功能模块定义。有定义的功能模块对象我们就有可能组织权限根据用户需要完成的工作配置用户业务功能菜单,这也符合"最少特权策略"。
      • 界面元素控制:除了功能菜单要受到控制外,如要控制功能模块的界面元素其功能模块界面元素也需定义,大部分界面元素均包含有相关的业务功能操作,所以对相应操作的界面元素是进行定义是有必要的。
      • 数据信息控制:业务功能模块的大部分界面元素是显示和操作数据内容的基础,也是用户对读取数据和操作数据的主要途径,为了数据信息的安全有必要对这界面元素的操作数据予以采取安全保密措施。这就需要对这些界面元素定义相关的数据约束条件。

      • 对象定义(流程) 流程图如下
         
    2. 权限定义工具。 
      在定义好系统对象的前提下,定义对象的在不同情况的的访问类型,希望对象在不同情况下具有不同的访问类型,这就需要定义对象的权限。定义权限就是是定义对象访问控制和数据访问控制。为了表述方便我们对权限用一个三元组符号来表示P(o,t,p),其中o 表示访问对象;t 表示访问类型;p 表示谓词。表示在谓词p为真时对于对象o可进行t类型的访问。权限定义系统安全管理基础步骤之一,只有给各种对象定义好访问的权限,才能给角色配置权限,基于角色管理才能成为可能。系统提供定义权限工具,请程序员根据实际需求定义对象的权限。 
      定义权限的流程图如下:
       

    3.2.2.2. 角色定义与权限配置

    1. 角色定义。 
      基于角色的访问控制方法的思想就是把对用户的授权分成两部份,用角色来充当用户行驶权限的中介。这样,用户与角色之间以及角色与权限之间就形成了两个多对多的关系。系统提供角色定义工具允许用户根据自己的需要(职权、职位以及分担的权利和责任)定义相应的角色。角色之间有相应继承的关系,当一个角色r1继承另一个角色r2时,r1就自动拥有了r2的访问权限(表示r1->r2)。角色继承关系自然的反映了一个组织内部权利和责任的关系,为方便权限管理提供了帮助。角色继承关系提供了对已有角色的扩充和分类的手段,使定义新的角色可以在已有角色的基础上进行,扩充就是通过增加父角色的权限去定义子角色,分类通过不同子角色继承同一父角色来体现。另外还允许多继承,即一个角色继承多个父角色,多继承体现对角色的综合能力。 
      角色定义示流程图如下:
       
    2. 权限配置。 
      角色是一组访问权限的集合,一个用户可以是很多角色的成员,一个角色也可以有很多个权限,而一个权限也可以重复配置于多个角色。权限配置工作是组织角色的权限的工作步骤之一,只有角色具有相应的权限后用户委派才能具有实际意义。 
      权限配置流程图如下:
       

    3.2.2.3. 用户、用户组定义

    1. 用户定义。 
      系统的最终使用者是用户,因此必须建立用户的鉴别机构,登记用户的身份信息。在系统中定义可登录的用户操作系统是系统安全管理所必须步骤,也是人与系统的接口。
    2. 用户组定义。 
      为了本系统适用于分散式权限管理,加入了用户组的概念,是指一群用户的集合。方便权限管理用户组也可以委派角色,当用户被加入用户组时自动对用户的所在用户组拥有的角色进行了委派。为了便于分散式权限管理系统同时还支持对部分组的权限进行下发方式处理,授权特定的用户对用户组的用户权限进行管理。

    3.2.2.4. 权限审查 
    在授权完成后可检查登录用户所的拥有的能力表信息,审查给用户的权限是合适,如不合适可重新进行用户委派和收回部分权限的处理。目前系统只能以对用户组管理的模式对一个用户组内的用户可进行部分权限收回处理。

    3.2.2.5. 用户鉴别机构 
    安全保护的首要问题是鉴别用户身份。目前有三种方法可用:第一、利用用户的物理特征(声波、指纹、相貌、签名)。这在理论是最可靠的,但由于物理特征可能随时间变化且记录尚欠成熟等原因,使该方法未能广泛应用。第二、利用用户特有的证件,如身份证、机器可读卡先考片,其缺点是证件可能被别人复制或冒用。第三、利用用户知道的某件能证明其身份的约定(如口令)。这是当前较为常用的方法。本系统采用第三种方法。

    用户名称标识其它情况
    CHENDAGOOD… …
    … …… …… …

    如上表所示是用户鉴别机构保存的一张登记有每个用户名称、标识和有关情况的表,表中的用户名通常是公开的,标识则是保密的,当用户要访问系统时,须首先把自已的名称和标识登记到系统中(即出示证件)。这时用户鉴别系统机构检查用户的标识是否与用表中的标识一致,是则认为用户身份己得到证实,否则认为是假冒,系统将拒绝用户要求执行的操作。口令是最常用的一种标识,通常由若干字母、数字组合而成。系统只允许用户连续两次或三次登记口令,如果都不对则要等待一段较长的时间才成重新登记,这种延长时间的方法能够有效的防止冒名者猜测口令的可能。

    3.2.2.6. 访问控制机构 
    杜绝对系统非法访问主要方法是访问控制。用户系统的访问规则可以用访问规则表示,根据安全策略用访问规则给0用户授权。访问控制就是要处理怎样表达和核对访问规则的问题。从形式上来说,一条访问规则可以写成四元组的形式(u,o,t,p)可前已有权限表示形式重新表示为(u,P)。系统的访问控制分为模块级控制和界面元素级控制。


     

    存贮和检查访问规则是访问控制机构须解决的部问题。本系统为考虑运行速度根据系统中角色、权限配置、用户委派等关系动态地的组成一张用户能力表保存在系统中根据上述配置信息改变由系统动态生成和保存。能力表(也称C-表)是存贮和核对访问规则的一种有效形式。能力表是面向主体的,用以说明主体能对那个访问对象执行何种操作。能力表的基本形式如下:

    SiJ(oi1,ti1,pi1)………..(oij,tij,pij)

    其中Si表示第I个主体;j为Si可访问的数据对象的个数;(oi1,ti1,pi1)为访问权限。全部主体的能力表的集合即为系统的全部访问规则。当某个访问请求需进行生效检查时,则按访问请求的主体找到能力表逐项核对以决定其是否有效。

    安全管理控制核心

    安全管理控制核心是系统安全管理的核心控制部分,它在系统中控制整个系统的安全控制工作,由它决定系统是否启动安全管理,在什么情况下调用访问控制机构,根据情况编写访问规则,如何将已有的访问规则应用于控制,存贮访问规则。

     

    系统评价

    4.1. 系统特点(自评)

    安全管理系统核心思想是在基于角色控制思想的基础上提取改进而来的,上述功能模型能较好œ鹤悴_房_⑷嗽碧岢龅南低撤梦士刂菩枨蟆7治鋈缦拢_/p>

      1. 实现了系统开发过程中的职责分离,系统的安全管理部分被作为整个系统的核心控制部分,单独的被分离出来制定一些整个系统通用的安全准则。程序员在开发时不要过多的考虑程序安全性的问题只需要遵系统的安全准则即可,而是把主要精力花费在系统的业务功能上。
      2. 有效的利用系统已有的资源减少系统的冗余,使系统的条理更加清楚。对已有功能模块只需设置不同的特征参数和对各种界面元素实施不同的访问类型控制,就能产生不同控制效果不需程序员再进行编写程序的工作。
      3. 基于角色对用户组进行访问控制:对一组用户比对单个用户进行访问控制更加合理,用户组代表了具有相近工作性质的一组用户的集合,可以委派完成用户组工作的角色以控制用户组的权限范围(当然我们也可以把角色看成是我们系统中一个特定用户组)。同时支持角色的继承和多继承。通过改变用户的当前角色集就可以改变用户的权限,而改变某种角色所含的权限时又可以改变一组用户的权限,基于这种访问控制方式有3个方面的作用:(1)简化了权限管理,避免直接在用户和数据之间进行授权和取消。研究表明,用户所具有的权限易于发生改变,而某种角色所对应的权限更加稳定;(2)有利于合理划分职责,用户只有其所应具有权限,这样可以避免越权行为,有关用户组的关系描述正是对此的支持;(c)防止权力滥用,敏感的工作分配给若干个不同的用户完成,需要合作的操作序列不能由单个用户完成。
      4. 支持动态地改变用户的权限:安全管理考虑了访问权限不是静态,而是动态的情况。所有对象的权限均用三元组来表示P(o,t,p)主体在系统中的访问规则用四元组来表示(s,o,t,p)。当产品系统使用工作流时,可通过产品平台与安全管理控制核心的接口,重新为编写访问规则,动态修改主体能力表。动态分配用户完成当前工作流环节所需的权限。
      5. 权限的相互关联:各种权限不是互相独立而是相互关联的,而且权限可以有感知其它用用户操作,这可以描述有关协同权限。功能例如在给数据编辑控件授权只读权限时,收回用户对数据插入和删除权限,该权限允许感知其它用户的操作,诸如某用户改变了数据等等。
      6. 提供方便的授权/取消机制和检查机制:只要进行简单的赋值操作即可完成授权,同时由角色分配规则和主体访问规则控制则指导模型式的应用。
      7. 用户之间的授权关系:依据角色指派关系,运行系统中的用户自身可以对角色进行管理,这提供了又一种动态改变用户权限的手段。通常,角色指派的权力都在系统中具有管理责任的用户手中。

        原文链接:http://www.ibm.com/developerworks/cn/security/syscontrol/
    展开全文
  • 目录 ...在实际开发中,开发任何一套系统,基本都少不了权限管理这一块。这些足以说明权限管理的重要性。其实SpringSecurity去年就学了,一直没有时间整理,用了一年多时间了,给我的印象一直都...

    写在前面: 从2018年底开始学习SpringBoot,也用SpringBoot写过一些项目。现在想对学习Springboot的一些知识总结记录一下。如果你也在学习SpringBoot,可以关注我,一起学习,一起进步。

    相关文章:

    【Springboot系列】Springboot入门到项目实战


    目录

    系统权限管理

    1、前言

    2、案例技术栈

    数据库设计

    2、表关系

    2、数据库表结构

    新建项目

    1、新建springboot项目

    2、项目结构

    编写代码

    1、编写实体类

    2、Security配置文件

    3、动态权限菜单加载相关方法

    4、首页菜单遍历

    测试应用

    1、对应效果展示

    2、测试应用

    3、案例代码下载


    系统权限管理

    1、前言

    在实际开发中,开发任何一套系统,基本都少不了权限管理这一块。这些足以说明权限管理的重要性。其实SpringSecurity去年就学了,一直没有时间整理,用了一年多时间了,给我的印象一直都挺好,实用,安全性高(Security可以对密码进行加密)。而且这一块在实际开发中也的确很重要,所以这里整理了一套基于SpringSecurity的权限管理。案例代码下面有下载链接。

    2、案例技术栈

    如果对于SpringSecurity还不了解的话可以先了解一下SpringSecurity安全控件的学习,页面采用的是Bootstrap写的(页面就简单的写了一下,可以根据自己的需求更改),其实后端理解了,前台就是显示作用,大家可以自行更换前台页面显示框架,持久层使用的是Spring-Data-Jpa,Spring-Data-Jpa入门篇。并且对后端持久层和控制器进行了一下小封装,Java持久层和控制器的封装。页面使用的Thymeleaf模板,SpringBoot整合Thymeleaf模板

    数据库设计

    2、表关系

    菜单(TbMenu)=====> 页面上需要显示的所有菜单

    角色(SysRole)=====> 角色及角色对应的菜单

    用户(SysUser)=====> 用户及用户对应的角色

    用户和角色中间表(sys_user_role)====> 用户和角色中间表

    2、数据库表结构

    菜单表tb_menu

    角色及菜单权限表sys_role,其中父节点parent 为null时为角色,不为null时为对应角色的菜单权限。

    用户表sys_user。

    用户和角色多对多关系,用户和角色中间表sys_user_role(有Spring-Data-Jpa自动生成)。

    新建项目

    1、新建springboot项目

    新建springboot项目,在项目中添加SpringSecurity相关Maven依赖,pom.map文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.2.2.RELEASE</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.mcy</groupId>
        <artifactId>springboot-security</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>springboot-security</name>
        <description>Demo project for Spring Boot</description>
    
        <properties>
            <java.version>1.8</java.version>
        </properties>
    
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-security</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-thymeleaf</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.springframework.security</groupId>
                <artifactId>spring-security-test</artifactId>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.thymeleaf.extras</groupId>
                <artifactId>thymeleaf-extras-springsecurity5</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-devtools</artifactId>
                <scope>runtime</scope>
                <optional>true</optional>
            </dependency>
            <dependency>
                <groupId>org.webjars.bower</groupId>
                <artifactId>bootstrap-select</artifactId>
                <version>2.0.0-beta1</version>
            </dependency>
            <dependency>
                <groupId>org.webjars</groupId>
                <artifactId>bootbox</artifactId>
                <version>4.4.0</version>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    

    2、项目结构

    编写代码

    1、编写实体类

    菜单表实体类TbMenu,Spring-Data-Jpa可以根据实体类去数据库新建或更新对应的表结构,详情可以访问Spring-Data-Jpa入门

    import com.fasterxml.jackson.annotation.JsonIgnore;
    import com.mcy.springbootsecurity.custom.BaseEntity;
    import org.springframework.data.annotation.CreatedBy;
    
    import javax.persistence.*;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 菜单表
     * @author
     *
     */
    @Entity
    public class TbMenu extends BaseEntity<Integer> {
    	private String name;
    	private String url;
    	private Integer idx;
    	@JsonIgnore
    	private TbMenu parent;
    	@JsonIgnore
    	private List<TbMenu> children=new ArrayList<>();
    
    	@Column(unique=true)
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    
    	public String getUrl() {
    		return url;
    	}
    
    	public void setUrl(String url) {
    		this.url = url;
    	}
    
    	public Integer getIdx() {
    		return idx;
    	}
    
    	public void setIdx(Integer idx) {
    		this.idx = idx;
    	}
    
    	@ManyToOne
    	@CreatedBy
    	public TbMenu getParent() {
    		return parent;
    	}
    
    	public void setParent(TbMenu parent) {
    		this.parent = parent;
    	}
    
    	@OneToMany(cascade=CascadeType.ALL,mappedBy="parent")
    	@OrderBy(value="idx")
    	public List<TbMenu> getChildren() {
    		return children;
    	}
    
    	public void setChildren(List<TbMenu> children) {
    		this.children = children;
    	}
    
    	public TbMenu(Integer id) {
    		super(id);
    	}
    
    	public TbMenu(){
    		super();
    	}
    
    	public TbMenu(String name, String url, Integer idx, TbMenu parent, List<TbMenu> children) {
    		this.name = name;
    		this.url = url;
    		this.idx = idx;
    		this.parent = parent;
    		this.children = children;
    	}
    
    	public TbMenu(Integer integer, String name, String url, Integer idx, TbMenu parent, List<TbMenu> children) {
    		super(integer);
    		this.name = name;
    		this.url = url;
    		this.idx = idx;
    		this.parent = parent;
    		this.children = children;
    	}
    
    	@Transient
    	public Integer getParentId() {
    		return parent==null?null:parent.getId();
    	}
    }
    

    表新建好了,下面就是实现增删改查就可以了。实现效果如下。

    新增和修改菜单。

    对于Bootstrap的树形表格,可以移步到:BootStrap-bable-treegrid树形表格的使用

    菜单管理实现了,下一步就是实现角色及角色对应的权限管理了。

    角色及权限表SysRole,parent 为null时为角色,不为null时为权限。

    package com.mcy.springbootsecurity.entity;
    
    import com.fasterxml.jackson.annotation.JsonIgnore;
    import com.mcy.springbootsecurity.custom.BaseEntity;
    import org.springframework.data.annotation.CreatedBy;
    import javax.persistence.*;
    import java.util.ArrayList;
    import java.util.List;
    
    @Entity
    /***
     * 角色及角色对应的菜单权限
     * @author
     *parent 为null时为角色,不为null时为权限
     */
    public class SysRole extends BaseEntity<Integer> {
    	private String name;	//名称
    	private String code;	//代码
    	@JsonIgnore
    	private SysRole parent;
    	private Integer idx;	//排序
    	@JsonIgnore
    	private List<SysRole> children = new ArrayList<>();
    	
    	@Column(length=20)
    	public String getName() {
    		return name;
    	}
    
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	public String getCode() {
    		return code;
    	}
    
    	public void setCode(String code) {
    		this.code = code;
    	}
    
    	@ManyToOne
    	@CreatedBy
    	public SysRole getParent() {
    		return parent;
    	}
    
    	public void setParent(SysRole parent) {
    		this.parent = parent;
    	}
    	
    	@OneToMany(cascade=CascadeType.ALL,mappedBy="parent")
    	public List<SysRole> getChildren() {
    		return children;
    	}
    	
    	public void setChildren(List<SysRole> children) {
    		this.children = children;
    	}
    
    	//获取父节点id
    	@Transient
    	public Integer getParentId() {
    		return parent==null?null:parent.getId();
    	}
    
    	public Integer getIdx() {
    		return idx;
    	}
    
    	public void setIdx(Integer idx) {
    		this.idx = idx;
    	}
    
    	public SysRole(String name, String code, SysRole parent, Integer idx, List<SysRole> children) {
    		this.name = name;
    		this.code = code;
    		this.parent = parent;
    		this.idx = idx;
    		this.children = children;
    	}
    
    	public SysRole(Integer id, String name, String code, SysRole parent, Integer idx, List<SysRole> children) {
    		super(id);
    		this.name = name;
    		this.code = code;
    		this.parent = parent;
    		this.idx = idx;
    		this.children = children;
    	}
    
    	public SysRole(Integer id) {
    		super(id);
    	}
    
    	public SysRole(){}
    }
    

    首先需要实现角色管理,之后在角色中添加对应的菜单权限。

    实现效果(也可以和菜单管理一样,用树形表格展示,根据个人需求。这里用的是树形菜单展示的)。

    给角色分配权限。

    最后实现的就是用户管理了,只需要对添加的用户分配对应的角色就可以了,用户登录时,显示角色对应的权限。

    用户表SysUser,继承的BaseEntity类中就一个ID字段。

    import com.fasterxml.jackson.annotation.JsonIgnore;
    import com.mcy.springbootsecurity.custom.BaseEntity;
    
    import javax.persistence.*;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 用户表
     */
    @Entity
    public class SysUser extends BaseEntity<Integer> {
    	private String username;	//账号
    	private String password;	//密码
    	private String name;		//姓名
    	private String address;		//地址
    	
    	@JsonIgnore
    	private List<SysRole> roles=new ArrayList<>();	//角色
    
    	@Column(length=20,unique=true)
    	public String getUsername() {
    		return username;
    	}
    	public void setUsername(String username) {
    		this.username = username;
    	}
    	
    	@Column(length=100)
    	public String getPassword() {
    		return password;
    	}
    	public void setPassword(String password) {
    		this.password = password;
    	}
    	
    	@Column(length=20)
    	public String getName() {
    		return name;
    	}
    	public void setName(String name) {
    		this.name = name;
    	}
    	
    	@ManyToMany(cascade=CascadeType.REFRESH,fetch=FetchType.EAGER)
    	@JoinTable(name="sys_user_role",joinColumns=@JoinColumn(name="user_id"),inverseJoinColumns=@JoinColumn(name="role_id"))
    	public List<SysRole> getRoles() {
    		return roles;
    	}
    	public void setRoles(List<SysRole> roles) {
    		this.roles = roles;
    	}
    
    	public String getAddress() {
    		return address;
    	}
    
    	public void setAddress(String address) {
    		this.address = address;
    	}
    
    	//角色名称
    	@Transient
    	public String getRoleNames() {
    		String str="";
    		for (SysRole role : getRoles()) {
    			str+=role.getName()+",";
    		}
    		if(str.length()>0) {
    			str=str.substring(0, str.length()-1);
    		}
    		return str;
    	}
    
    	//角色代码
    	@Transient
    	public String getRoleCodes() {
    		String str="";
    		for (SysRole role : getRoles()) {
    			str+=role.getCode()+",";
    		}
    		if(str.indexOf(",")>0) {
    			str=str.substring(0,str.length()-1);
    		}
    		return str;
    	}
    	
    }

    用户管理就基本的数据表格,效果如图。

    2、Security配置文件

    Security相关配置文件,下面两个文件如果看不懂,可以访问SpringSecurity安全控件的学习中有详细讲解。

    package com.mcy.springbootsecurity.security;
    
    import com.mcy.springbootsecurity.service.SysUserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    
    @Configuration
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Autowired
        private SysUserService userService;
    
        /**
         * 用户认证操作
         * @param auth
         * @throws Exception
         */
        @Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
            //添加用户,并给予权限
            auth.inMemoryAuthentication().withUser("aaa").password("{noop}1234").roles("DIY");
            //设置认证方式
            auth.userDetailsService(userService).passwordEncoder(new BCryptPasswordEncoder());
        }
    
        /**
         * 用户授权操作
         * @param http
         * @throws Exception
         */
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable();    //安全器令牌
            http.formLogin()
                    //登录请求被拦截
                    .loginPage("/login").permitAll()
                    //设置默认登录成功跳转页面
                    .successForwardUrl("/main")
                    .failureUrl("/login?error");   //登录失败的页面
            http.authorizeRequests().antMatchers("/static/**", "/assets/**").permitAll();    //文件下的所有都能访问
            http.authorizeRequests().antMatchers("/webjars/**").permitAll();
            http.logout().logoutUrl("/logout").permitAll();     //退出
            http.authorizeRequests().anyRequest().authenticated();    //除此之外的都必须通过请求验证才能访问
        }
    }

    获取登录者相关信息,工具类。

    import com.mcy.springbootsecurity.entity.SysUser;
    import com.mcy.springbootsecurity.service.SysUserService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.security.core.GrantedAuthority;
    import org.springframework.security.core.context.SecurityContextHolder;
    import org.springframework.security.core.userdetails.UserDetails;
    import org.springframework.stereotype.Component;
    
    import java.util.ArrayList;
    import java.util.List;
    
    //创建会话,获取当前登录对象
    @Component
    public class UserUtils {
    	@Autowired
    	private SysUserService userService;
    
    	/**
    	 * 获取当前登录者的信息
    	 * @return 当前者信息
    	 */
    	public SysUser getUser() {
    		//获取当前用户的用户名
    		String username = SecurityContextHolder.getContext().getAuthentication().getName();
    		SysUser user = userService.findByUsername(username);
    		return user;
    	}
    
    	/**
    	 * 判断此用户中是否包含roleName菜单权限
    	 * @param roleName
    	 * @return
    	 */
    	public Boolean hasRole(String roleName) {
    		//获取UserDetails类,
    		UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    		List<String> roleCodes=new ArrayList<>();
    		for (GrantedAuthority authority : userDetails.getAuthorities()) {
    			//getAuthority()返回用户对应的菜单权限
    			roleCodes.add(authority.getAuthority());
    		}
    		return roleCodes.contains(roleName);
    	}
    }

    3、动态权限菜单加载相关方法

    用户表的SysUserService需要实现UserDetailsService接口,因为在SpringSecurity中配置的相关参数需要是UserDetailsService类的数据。重写UserDetailsService接口中的loadUserByUsername方法,通过该方法查询对应的用户,返回对象UserDetails是SpringSecurity的一个核心接口。其中定义了一些可以获取用户名,密码,权限等与认证相关信息的方法。

    重写的loadUserByUsername方法。

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //调用持久层接口findByUsername方法查询用户。
        SysUser user = userRepository.findByUsername(username);
        if(user == null){
            throw new UsernameNotFoundException("用户名不存在");
        }
        //创建List集合,用来保存用户菜单权限,GrantedAuthority对象代表赋予当前用户的权限
        List<GrantedAuthority> authorities = new ArrayList<>();
        //获得当前用户角色集合
        List<SysRole> roles = user.getRoles();
        List<SysRole> haveRoles=new ArrayList<>();
        for (SysRole role : roles) {
            haveRoles.add(role);
            List<SysRole> children = roleService.findByParent(role);
            children.removeAll(haveRoles);
            haveRoles.addAll(children);
        }
        for(SysRole role: haveRoles){
            //将关联对象role的name属性保存为用户的认证权限
            authorities.add(new SimpleGrantedAuthority(role.getName()));
        }
        //此处返回的是org.springframework.security.core.userdetails.User类,该类是SpringSecurity内部的实现
        //org.springframework.security.core.userdetails.User类实现了UserDetails接口
        return new User(user.getUsername(), user.getPassword(), authorities);
    }

    所有功能实现了,最后就是根据角色去显示对应的菜单了。

    在TbMenuService类中的findAuditMenu方法,查询当前用户所拥有的权限菜单。

    /**
     * 获取用户所拥有的权限对应的菜单项
     * @return
     */
    public List<TbMenu> findAuditMenu() {
        List<TbMenu> menus;
        //判断是否是后门用户
        if(userUtils.hasRole("ROLE_DIY")){
            //查询所有菜单,子菜单可以通过父级菜单的映射得到
            menus = menuRepository.findByParentIsNullOrderByIdx();
        }else{
            //获取此用户对应的菜单权限
            menus = auditMenu(menuRepository.findByParentIsNullOrderByIdx());
        }
        return menus;
    }
    
    //根据用户的菜单权限对菜单进行过滤
    private List<TbMenu> auditMenu(List<TbMenu> menus) {
        List<TbMenu> list = new ArrayList<>();
        for(TbMenu menu: menus){
            String name = menu.getName();
            //判断此用户是否有此菜单权限
            if(userUtils.hasRole(name)){
                list.add(menu);
                //递归判断子菜单
                if(menu.getChildren() != null && !menu.getChildren().isEmpty()) {
                    menu.setChildren(auditMenu(menu.getChildren()));
                }
            }
        }
        return list;
    }

    在UserUtils工具类中的hasRole方法,判断此用户中是否包含roleName菜单权限。

    public Boolean hasRole(String roleName) {
    	//获取UserDetails类,
    	UserDetails userDetails = (UserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    	List<String> roleCodes=new ArrayList<>();
    	for (GrantedAuthority authority : userDetails.getAuthorities()) {
    		//getAuthority()返回用户对应的菜单权限
    		roleCodes.add(authority.getAuthority());
    	}
    	return roleCodes.contains(roleName);
    }

    之后在控制器中返回用户对应的菜单权限,之后在前台页面遍历就可以了。

    @RequestMapping(value = "/main")
    public String main(ModelMap map){
        //加载菜单
        List<TbMenu> menus = menuService.findAuditMenu();
        map.put("menus", menus);
        if (menus.isEmpty()) {
            return "main/main";
        }
        return "main/main1";
    }

    4、首页菜单遍历

    首页菜单遍历,这里使用的是LayUI菜单,如果其他框架可以自行根据页面标签规律遍历,因为页面使用的是Thymeleaf模板,不是JSP,使用遍历菜单时不是采用的EL表达式,而是使用的Thymeleaf自带的标签表达式Thymeleaf模板的使用

    <div id="main">
        <div id="main_nav">
            <div class="panel-group" id="accordion" style="margin-bottom: 0;">
                <div th:each="menu, menuStat: ${menus}" th:if="${menu.children.size() != 0 && menu.children != null}" class="panel panel-default">
                    <div class="panel-heading">
                        <h4 class="panel-title">
                            <p data-toggle="collapse" data-parent="#accordion" th:href="|#collapseOne${menuStat.index}|">
                                <span th:text="${menu.name}">系统设置</span><span class="caret"></span>
                            </p>
                        </h4>
                    </div>
                    <div th:if="${menuStat.first}" th:id="|collapseOne${menuStat.index}|" class="panel-collapse collapse collapse in">
                        <div class="panel-body">
                            <p th:each="subMenu:${menu.children}" th:src="${subMenu.url}" th:text="${subMenu.name}">菜单管理</p>
                        </div>
                    </div>
                    <div th:if="${!menuStat.first}" th:id="|collapseOne${menuStat.index}|" class="panel-collapse collapse collapse">
                        <div class="panel-body">
                            <p th:each="subMenu:${menu.children}" th:src="${subMenu.url}" th:text="${subMenu.name}">菜单管理</p>
                        </div>
                    </div>
                </div>
            </div>
            <div id="nav_p">
                <p th:each="menu:${menus}" th:if="${menu.children.size() == 0}" th:src="${menu.url}" th:text="${menu.name}">成绩管理</p>
            </div>
        </div>
        <div id="main_home">
            首页内容
        </div>
    </div>

    测试应用

    1、对应效果展示

    用户数据及对应的角色

    管理员对应的菜单权限。

    用户角色对应的菜单权限。

    测试用户角色对应的菜单权限。

    2、测试应用

    用户名为admin1有管理员角色的用户登录,菜单显示。

    用户名为admin2有用户角色的用户登录,菜单显示。

    用户名为admin3有测试用户角色的用户登录,菜单显示。

    3、案例代码下载

    下载地址:https://github.com/machaoyin/SpringBoot-Security

    最后有什么不足之处,欢迎大家指出,期待与你的交流。

    展开全文
  • 作者:赵玉开,十年以上互联网研发经验,2013年加入京东,在运营研发部任架构师,期间先后主持了物流系统自动化运维平台、青龙数据监控系统和物流开放平台的研发工作,具有丰富的物流系统业务和架构经验。...

    作者:赵玉开,十年以上互联网研发经验,2013年加入京东,在运营研发部任架构师,期间先后主持了物流系统自动化运维平台、青龙数据监控系统和物流开放平台的研发工作,具有丰富的物流系统业务和架构经验。在此之前在和讯网负责股票基金行情系统的研发工作,具备高并发、高可用互联网应用研发经验。


    简单来理解,自动化运维就是要通过机器的方式来简化整体的运维过程,特别是优化重复类型的工作,以提高运维效率,减少因人工而引起的失误操作。随着运维管理的复杂度和难度增大,自动化运维也基本成为了运维平台演进的必经之路。但如何落地自动化运维平台,不同的企业因为运维发展阶段和业务体量的不同,都有不一样的实现路径。


    以京东为例,它的物流系统有很多分支机构, 比如仓库、分拨中心、转运中心等, 业务复杂的分支机构可能会有自己的信息系统, 这些信息系统往往分布式地部署到全国各地,那如何基于自动化运维平台管理好这些分支机构的服务器、 信息系统, 降低因为地域分布造成的运维维护成本呢?京东资深架构师赵玉开向 InfoQ 记者深入介绍了他们在自动化运维平台方面的一些探索和实践。另外,赵玉开也将会在 9 月 10 日举行的 CNUTCon 全球运维技术大会 上分享相关话题,欢迎关注。


    InfoQ:可以先介绍下目前京东物流系统自动化运维平台的一些基本情况吗?


    赵玉开: 京东物流系统自动化运维平台从 2014 年开始启动到现在已经历了三各阶段,到目前管理了 MySQL、JMQ、 Redis 及自研应用等多种实例。


    众所周知,京东业务发展迅猛,每周都需要开仓,数量多达十几个。最初开仓过程特别冗长和复杂,开仓过程中涉及到研发人员部署系统、运营人员手动填写多种申请、运维人员不仅要负责中间件安装,还要负责整个流程中每个环节的进展确认及协调,这直接导致了开仓慢,且涉及到的各部门都需要投入大量的人力成本。


    基于此,2014 年初我们启动了一期自动化运维平台研发的项目,2014 年 10 月项目一期上线时,已基本解决了开仓慢和人力成本的问题,也减少了开仓过程中运维同学的重复性工作内容,制定标准化模板,解放了研发人员的重复性部署工作。运营人员可通过模板直接设置,将之前一些繁琐的密码、JMQ Token 等数据实现自动化配置,大大减少了流程耗费的时间。


    一期上线后,得到了流程中各环节涉及部门的赞赏,并在得到大家积极反馈后,迅速进入到二期项目。二期项目完成后,数据的初始化问题和研发日常批量部署问题也得到了解决,系统的自动化程度已可以满足日常的工作需求。


    今年初,为接入更多物流作业单位,如分拣中心, 亚洲一号自动化物流中心等,我们开启了三期项目,目前项目还在持续前行中。


    InfoQ:谈谈你们的自动化运维架构?以及具体涉及到的技术栈?


    赵玉开: 我们的自动化运维的核心组件是 SaltStack, 我们基于 SaltStack 做了很多自定义的模块、Grains 和 Runner, 通过这些自定义的模块、Grains 以及 Runner 来支撑我们的开仓、部署、数据同步等功能。


    如下图是一个指令执行过程图, 分为两个部分, 上面部分为部署在 IDC 的模块, 下半部分则是部署在库房机房的模块。

    我们先逐个介绍部署在 IDC 部分的模块:

    1. Web 使用 Java 技术, 为用户提供操作界面, 控制操作权限, 使用 Activiti 工作流引擎驱动各种流程, 下发开仓过程中的自动化运维指令;

    1. Salt-API-Proxy 是 Salt-API 的代理层, 通过 Nginx 实现了反向代理, 在 Nginx 的配置中对发送指令的服务器 IP 做了限制, 另外可以通过配置指向工作的 Salt-API 服务器;

    1. Salt-API 负责和 Salt-Master 交互发送 SaltStack 的 Runner 与 Module 的 API 指令, Runner 指令是运行在 Salt-Master 服务器上的, 可以读取 master 配置, 也可以在一个 Runner 中协调执行多个 Module 运行结果;

    1. Salt-Master 有两个职责, 一是接受 salt-api 指令, runner 在本地执行, module 下发指令到对应的 salt-minion, 另一职责是运维同学手动下发指令, 完成一些非常见的 minion 配置工作;

    2. RsyncServer 负责中间件安装文件, 自研软件的文件存储和下发, RsyncServer 的文件存储是由 Salt-Master 发起的, Salt-Master 接受到 salt-api 的应用部署指令后, 会从部署指令中获得部署包下载地址, 然后下载到指定部署包存储目录, 并做解压操作; RsyncServer 的文件下发指令则是有 salt-minion 端的 Module 执行触发的。


      仓库部门和 IDC 之间通过 VPN 联通, 每个仓库的服务器上都安装了 SaltStack 的 minion 端, minion 端是一个 Python 进程, 负责接收 Master 的 Module 指令, 并在本地执行。另外 minion 端在执行指令过程中需要将执行过程中的输出及时的输出给用户端, 让用户可以通过 Web 端查看执行过程的情况, 即运维的可视化, 我们是通过 minion 端的可视化模块, 将执行过程输出通过 HTTP POST 方式发送给 Web 端, Web 端将 POST 内容存储到任务执行过程输出表中, 前端通过轮询方式读取输出表中的增量消息显示给用户端。


      我们采用的技术栈是 Java + Python。  前端界面展示、 工作流、权限控制、任务下发这些都是用的 Java 的 Spring MVC + MyBatis; 后端用的是 Python + Shell, Python 写了大量的 SaltStack 自定义模块。


      InfoQ:为什么当初要选择 SaltStack 而没有选择 Ansible?


      赵玉开: 不可否认 Ansible 也是一个非常好的自动化运维工具, 但是基于以下两点我们最终选择了 SaltStack:

      1. API 的易用性方面和 SaltStack 有差距, 我们的自动化运维系统一开始就有一个目标, 将开仓部署以及推广版本这些功能开放给物流运营人员, 所以必须做好前端用户体验, 这需要好用的 API, SaltStack 恰好有;

      1. 性能,标准 SSH 连接的时候比较耗时,ZeroMQ 传输的速度会快很多。


      InfoQ:在应用部署自动化这块,你们是怎么做的?


      赵玉开: 应用部署大致分为这么几个步骤: 打包、下发文件、更新配置、停止启动实例、备份部署版本, 具体如下。

      1. 我们使用的公司统一的打包系统, 打包系统打好包, 部署任务审批通过,自动化运维系统就可以通过 API 获得打包文件, 然后将部署包上传到版本服务器, 并解压缩,放到对应版本目录下;

      1. 通过 SaltStack 的 API 下发部署指令给部署目标服务器, 部署指令是一个 SaltStack 自定义模块, 该模块首先会执行 rsync 指令从版本服务器上同步变更文件;

      1. 文件下发之后更新配置, 通过 Web 接口请求自动化运维的 Web 端下发配置文件, 然后更新配置文件, 我们线上的配置文件是通过环境变量来配置的, 所以不管有多少个库房, 都不需要更新配置文件, 只有在特殊需求是设置环境变量, 就可以依据当前作业单位的不同改变下发的配置文件的内容;

      1. 调用应用的 stop.sh 脚本停止当前实例, 再调用 start.sh 脚本启动实例, 这里有一个约定, 不管是 Web 应用还是非 Web 应用必须在部署目录有一个 bin 目录下面有 start.sh 和 stop.sh 两个文件;

      2. 如果步骤 4 执行成功, 那么将此版本的文件备份到当前服务器上, 以备回滚使用。


        InfoQ:自动化运维解决了你们哪些问题?没有解决哪些问题?


        赵玉开: 自动化运维解决了我们开仓周期长,人力成本高的问题, 提升了全国部署推广的效率, 大大减少了运维同事的重复性工作, 把对成熟版本的推广工作交给了运营人员, 减少了研发同事在推广上线工作上的时间。


        现阶段正在探索如何通过自动化运维技术快速排查问题, 另外就是我们未来会有一些自动化的物流作业单位,如何用自动化运维平台管理好这些自动化的设备和设备软件也是我们在探索的。


        InfoQ:自动化运维平台上线了这么长时间,有做过复盘吗?有哪些经验可以分享给读者?未来有什么计划?


        赵玉开: 做过一些复盘, 每一期开发结束下一迭代开始的时候都会做复盘, 对现有问题进行总结, 同时收集下一步的需求。  目前看最深刻的体会是做自动化运维系统一定要做好元数据的管理,元数据要管理好服务器信息属性、 应用信息、应用配置、实例管理以及作业单位, 这些元数据要在一开始就做好, 能自动化收集的要自动化收集, 动态的参数一定要动态控制, 比如 Redis、MySQL 都有主从关系, 元数据中要存储这个主从关系, 但是不能写死, 必须有机制来更新主从关系, 否则 Redis 哨兵程序更新了 Redis 主从关系, 或者 MySQL DBA 因为某些原因切换了 MySQL 的主从, 自动化运维系统的元数据没有做对应更新,再执行指令时就会出问题, 甚至发生事故。


        未来计划有两个方面:

        1. 继续通过自动化运维系统来提升运维效率、 降低研发对应用运维的投入;

        1. 做自动化物流作业系统的自动化运维, 管好其中的设备和软件服务。


        InfoQ:在 CNUTCon 全球运维技术大会 上,你将会为读者分享哪些技术点?


        赵玉开: 这次大会我会给大家介绍下京东物流自动化运维平台的技术架构, 并详细介绍自动化开仓、批量部署的技术细节。




        CNUTCon 全球运维技术大会将于 9 月 10-11 日在上海举行,大会以“智能时代的新运维”为主题,涵盖 AIOps、SRE、DevOps、运维监控与安全等专场,邀请了来自 Google、Uber、eBay、BAT、携程、京东等公司大咖分享他们在最新运维技术实践过程中遇到的坑与经验,现场为你解疑答惑,点击“阅读原文”了解更多精彩!9 折限时优惠,报名时输入 CNUTCon-KAITAO 还可再减 200 !




        展开全文
      1. 版本控制或源代码管理系统是软件开发必备的。本文为您介绍9款优秀的开源版本控制系统,它们在软件行业已经得到了广泛应用。  1.Subversion  Subversion是一个开源的版本控制系统。由CollabNet公司首创于...
      2. 1. 4A系统的需求分析 近年来企业用户的业务系统发展十分迅速,内部的系统数...各系统都有一套独立的认证、授权和审计机制,分别由相应的系统管理员负责维护和管理。帐号繁多,管理困难,管理成本较高;对于离职或者...
      3. C#桌面办公应用-工资管理系统系列五 接前文系列四,本文将讲解实现工资管理系统的代码的层次结构。主要采用的是MVCS模式的代码层次结构,视图层(V):是各种winform窗体;控制层(C):主要是winform窗体中各种控件的...
      4. 【C语言】学籍管理系统

        万次阅读 多人点赞 2018-06-03 22:34:28
        C语言 – 学籍管理系统 功能简介 链表实现基本的创建增删改查。 成绩分析,链表的冒泡排序。 分管理员,老师,学生三端管理,密码的修改,加密。 分班级管理老师学生。 方框界面,↑↓键控制,ENTER...
      5. http://www.dzsc.com/data/html/2010-11-24/87326.html   密钥管理系统(Key Management System),也简称KMS,是IC项目安全的核心。如何进行密钥的安全管理,贯穿着IC卡应用的整个生命周期。  非接触C
      6. 信息系统项目管理--上午分析笔记

        万次阅读 2019-10-29 10:22:29
        运维管理平台使运维自动化、操作化,但并不能降低运维人员的技术要求。 UML是一种标准的图形化建模语言 不可抗力:1.自然灾害(地震、洪水);2.政府行为(征收、停电);3.社会异常(战争、骚乱) 合同调解,选择的裁定...
      7. 企业综合安防管理平台

        千次阅读 2020-08-17 15:41:14
        企业综合安防管理平台 平台概述 长期以来各厂家以市场为导向,专注于具备自身特长的单一系统产品,造成目前在技防领域出现的众多分项系统各自为政的局面,如单一的视频监控系统、门禁系统、访客系统、停车管理...
      8. MFC课程设计 --学生成绩管理系统

        万次阅读 多人点赞 2018-07-26 21:12:55
        MFC课程设计 ,C++课程设计 --学生成绩管理系统 ps:因为课设完成的过程大家都不太一样,以下的代码仅供学习一下在MFC下各个控件的用法,有问题欢迎留言讨论。     实验目的 使用MFC类库编制应用程序:按钮...
      9. CA系统的同及多技术

        千次阅读 2010-10-13 14:35:00
        CA系统的同及多技术目前,全球在数字电视的CA(Conditional Access:条件接收)技术方面,流行着两大标准,即美国的ATSC(Advanced Television Systems Ccommittee:先进电视系统委员会)标准和欧洲的DVB...
      10. 2011年上半年 信息系统项目管理师 上午试卷 (考试时间 9 : 00~11 : 30 共 150 分钟) 1. 在答题卡的指定位置上正确写入你的姓名和准考证号,并用正规 2B 铅笔在你写入的准考证号下填涂准考证号。 2. 本试卷的...
      11. PHP新闻管理系统(包括前台后台)

        万次阅读 多人点赞 2018-06-24 22:29:45
        一、 题目基于PHP的新闻发布系统二、 需求分析1、 软件功能新闻发布系统(News Release System or Content Management System)又叫做内容管理系统CMS(Content Management System),是一个基于网络的新闻发布和...
      12. ●在计算机系统中,(3)是指在CPU执行程序的过程中,由于发生了某个事件,需要CPU暂时中止正在执行的程序,转去处理该事件,之后又回到被中止的程序。 (3)A.调用 B.调度 C.同步 D.中断 ●掉电后存储在(4)中...
      13. 测试后台管理系统思路和方法

        万次阅读 多人点赞 2019-08-01 14:02:53
        每个公司不管做什么业务,开发网站,app或者公众号亦或小程序,但凡涉及到用户信息或者订单信息都有对应的后台管理系统,所以每个测试人员基本上都有测试过后台管理系统的经验,但是后台管理系统测试不仅仅是基本的...
      14. 开源系统管理资源大合辑

        千次阅读 2016-07-27 20:32:52
        Automation build.自动化构建 Apache Ant – 用 Java 编写的自动...Bazel – Google 的分布式构建系统 GNU Make – 最流行的自动化构建系统 Gradle – 另一个自动化构建系统 Backup software.备份软件 Amanda – C/S 模
      15. 应用系统安全管理

        千次阅读 2017-04-05 17:12:22
        应用系统的安全管理 1 身份鉴别 1.1 应用系统采用专用的登录控制模块
      16. 用java的swing组件实现简易的图书管理系统

        万次阅读 多人点赞 2018-01-14 15:30:07
        图书管理系统在生活和学校中是最为常见的,这学期的java课程设计题目中的其中一个就是实现图书管理系统, 做完课设后,在此记录下。 我的图书管理系统一共分为几个模块。图书查询模块,管理员模块(默认只有一个...
      17. 2013年3月,我公司作为系统集成的承包商承接了XX市交通运输局的道路交通智能监控抓拍系统项目,我作为该项目的项目经理负责全程项目管理。 该项目是XX市道路交通车辆监管工程的重要组成部分,在全市道路的重要路段...
      18. 图书馆管理系统设计说明书

        万次阅读 多人点赞 2014-11-06 12:59:28
        图书馆信息管理系统 软件设计说明书 文档编号:QY2014007-LY7 文档信息:图书馆信息管理系统软件设计说明书 文档类别:管理文档  级:机密 版本信息:1.0 建立日期:2014-05-20   创 建 人: 审 核...
      19. 基于Spring+SpringMVC+Mybatis分布式敏捷开发系统架构,提供整套公共微服务服务模块:集中权限管理(单点登录)、内容管理、支付中心、用户管理(支持第三方登录)、微信平台、存储系统、配置中心、日志分析、任务和...
      20. JAVA超市管理系统

        万次阅读 多人点赞 2017-12-29 17:05:38
        目录   项目简介 项目框架 项目实现 &...超市系统的实现界面&gt;  &lt;主界面&gt;  &lt;小吃类&gt;  &lt;蔬菜类&gt;  &lt;熟食类&gt;  &
      21. 本文仅以学习交流为目的请勿用于非法用途 ...【去除控制】对学生机房管理助手密码破解的分析 1st https://blog.csdn.net/qq_37485351/article/details/93291748 如果不想看比较繁琐的密码破解方式 可百...
      22. 图书馆管理系统需求规格说明书

        万次阅读 多人点赞 2014-11-06 13:07:14
        青院图书馆信息管理系统 软件需求规格说明书 文档编号:QY2014007-LY7 文档信息:图书馆信息管理系统软件需求规格说明书 文档类别:管理文档  级:机密 版本信息:1.0 建立日期:2014-05-20   创 建 人: 审 ...
      23. 2016上半年信息系统管理工程师 下午试卷I (考试时间 14:00~16:30 共 150分钟) 1.在答题纸的指定位置填写你所在的省、自治区、直辖市、计划单列市的名称。 2.在答题纸的指定位置填写准考证号、出生年月日和...
      24. wxpython+MySQL实现学生信息管理系统

        千次阅读 多人点赞 2018-09-18 23:43:51
        1.布局管理是可视化编程的基础思维,尽量避免定点式布局,不规则分布的各种控件可以局部先用wx.StaticBox(静态框)水平或垂直组合进来,再横向或纵向上与其他控件组合并,利用布局管理的内置参数设置,灵活控制想要...
      25. 信息系统项目管理师教程(第3版)

        千次阅读 2018-03-09 15:18:38
        依据2017年信息系统项目管理师大纲(第2版)修订的新版教程。 自2005年至2016年底累计培养了6万名高级项目管理人才。图书简介本书是全国计算机技术与软件专业技术资格(水平)考试办公室组织编写的考试指定用书,...
      26. 图书馆管理系统测试计划说明书

        万次阅读 多人点赞 2014-11-06 13:03:05
        图书馆信息管理系统测试计划                 文档编号:MLRGS_EDS 文档名称:图书馆信息管理系统软件测试计划书  级:秘密 版本信息:0.01 建立日期:2013-11-06   创 建 人: 审 ...

      空空如也

      空空如也

      1 2 3 4 5 ... 20
      收藏数 195,642
      精华内容 78,256
      关键字:

      密控系统管理平台