精华内容
下载资源
问答
  • 基于角色管理系统访问控制

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

    用户名称 标识 其它情况
    CHENDA GOOD … …
    … … … … … …

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

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


     

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

    Si J (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

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

    展开全文
  • 需求分析: 有个厂家,下面有很多代理商(商户或门头等),之前商户进货、库存、...本系统角色主要分两个层级:总管理(厂家),下级管理(商户) 各商户管理自己的进销存数据和客户资料 厂家能查看所有商户实时经营情况

    需求分析:

    有个厂家,下面有很多代理商(商户或门头等),之前商户进货、库存、销售、客户资料等记录在excel表格中

    或者无记录,管理比较混乱,盈利情况不明。不能有效了解店铺经营情况和客户跟踪记录

    厂家也不能实时了解下面代理商的经营状况和库存情况

    解决方案:

    本系统角色主要分两个层级:总管理(厂家),下级管理(商户)

    各商户管理自己的进销存数据和客户资料

    厂家能查看所有商户实时经营情况

    -------------------------------------------------------------------------------------------------------------------------

    系统介绍:

    1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用)

    2.springmvc +spring4.2.5+ mybaits3.3  SSM 普通java web(非maven)  数据库:mysql

    3.开发工具:myeclipse  eclipse idea 均可, 没有限制. 我这边myeclipse 2014 导出来的项目源码

    -------------------------------------------------------------------------------------------------------------------------

    业务模块

    主页: 记录总进货额、总销售额、总销售利润、30天内销售金额
               统计总客户数、30天新增客户数
               图表统计(折线图和柱状图)展示从当前月份开始前12个月销售情况

    1.   客户资料:记录客户资料,备注客户信息,跟踪记录客户状况
    2.   客户备注:客户资料附属选项
    3.   客户级别:客户资料附属选项

    4.   商品列表:维护商品数据,有富文本编辑器,有明细表上传商品图片
    5.   商品类别:商品附属选项
    6.   品牌管理:商品附属选项
    7.   计量单位:商品附属选项

    8.     商品库存:展现商品库存情况,库存小的排最前
    9.     商品入库:录入商品入库数据,数量、单价、入库时间。计算某时间范围内的进货总金额
    10.   商品出库:录入商品出库数据,数量、销售价格、销售出库时间。计算某时间范围内的销售总金额
    11.   库存盘点:柱状图展示商品库存情况,以便及时补仓
    12.   销售报表:列表展示商品销售情况,可根据销量和销售额排序,以便掌握哪个商品卖的好并调整销售方案

    系统模块

    1.   权限管理:点开二级菜单进入三级菜单显示 角色(基础权限)和按钮权限
          角色(基础权限): 分角色组和角色,独立分配菜单权限和增删改查权限。
          按钮权限: 给角色分配按钮权限。
    2.   按钮管理:自定义按钮管理,维护按钮权限标识等
    3.   菜单管理:无限级别自定义菜单,自定义菜单图标,业务菜单和系统菜单分离,菜单状态显示隐藏(递归处理
    4.   数据字典:无限级别,支持多级别无限分类。内设编号,排序等
    5.   在线管理:websocket技术,实时检测在线用户列表,统计在线人数,可强制用户下线 同一用户只能在一个客户端登录
    6.   日志管理:记录用户登录退出和一些重要操作记录
    7.   系统用户:对各个基本的用户增删改查,单发、群发站内信邮件短信,导入导出excel表格,查看商户经营状况
    8.   性能监控:监控整个系统的性能,SQL监控,SQL防火墙,URL监控,SPRING监控,SESSION监控等
    9.   图片管理:对批量上传的图片统一管理 ,点击放大,可打开多个,自由切换,绚丽预览效果
    10. 图片爬虫:输入某网址,爬出其图片显示在页面上,可以放大预览。可保存到服务器上,到图片管理里面
    11. 站内信:收信箱和发信箱, websocket技术通讯技术做的及时收信提醒,可配置语音提示来信

    12. 系统设置:修改系统名称,邮件服务器配置,短信账号设置,图片水印配置
    13. 数据库备份:可备份单表、整库,支持本地和远程数据库备份
    14. 备份定时器:quartz 2.2 强大的任务调度,多线程备份数据库,任务启动关闭异步操作
    15. 数据库还原:历史备份记录,还原数据库 or 单表 ,统计备份时间和文件大小
    16. SQL编辑器:强大的SQL编辑器,支持编辑语句复杂查询语句,生成动态报表,可导出excel

    菜单权限:分配给每个角色不同的菜单权限, 每个角色看到的菜单不同,无限级别菜单
    按钮权限:独立分配不同的角色不同的功能权限,增删改查权限分配具体到不同的菜单,自定义按钮管理
    支持多用户分权限管理后台,  权限具体到不同的菜单不同的按钮

    -------------------------------------------------------------------------------------------------------------------------

    技术点

    1. 导出 导入 excel 文件
    2. IO 流上传下载文件
    3. 群发邮件,可以发html、纯文本格式,可以发给任意邮箱(实现批量发送广告邮件)
    4. 群发or单独 发送短信,支持两种第三方短信商接口
    5. spring   aop  事务处理
    6. MD5加密 SHA加密(登录密码用此加密)接口加密身份校验
    7. 数据库连接池  阿里的 druid。Druid在监控、可扩展性、稳定性和性能方面都有明显的优势,支持并发
    8.加入安全框架 shiro (登录授权)(session管理)
    9.根据汉字 解析汉字的全拼(拼音)和首字母(导入excel到用户表,根据用户的汉字姓名生成拼音的用户名)
    10.java Quartz2.2 任务调度
    11.Base64传输图片
    12.图片加水印(图片水印,文字水印)
    13.批量异步上传图片,可预览,有进度条,支持拖拽上传(百度webuploader )。列表动态滑动放大展示。
    14.ehcache 自定义二级缓存 ,选择缓存存放目录,处理并发,增加系统性能
    15.uploadify 上传插件,单条、批量上传多线程,带进度条,异步,图片、视频, 其它文件格式均可上传
    16.tab标签页面功能,标签自由切换,不重复操作数据库
    17.百度富文本编辑器,可上传图片
    18.网页爬虫技术,可根据网页地址爬取图片和网页标题等信息(爬取某商城图片保存本服务器)
    19.java websocket 即时通讯技术,点对点,群聊,单聊

    20.HTML5 + JAVAEE  WebSocket 通信技术,WebSocket 验证用户登录,强制某用户下线
    21.站内信语音提醒,js控制音频播放
    22.调用摄像头拍照技术,图片裁剪技术

    下载地址点击 



    下载地址点击 

    登录界面背景用HTML5特效自动切换(百叶窗,幕布等多种切换方式) 有背景音乐和背景动画

    展开全文
  • 8月16日,“舟山市‘建设事业IC卡密钥管理系统’城市级密钥生成仪式”在舟山市城市一卡通有限公司隆重举行。住房和城乡建设部IC卡应用服务中心陈超华、王鑫、张昕,舟山市政府戴登禄副秘书长、市人力社保局张伟副...
        8月16日,“舟山市‘建设事业IC卡密钥管理系统’城市级密钥生成仪式”在舟山市城市一卡通有限公司隆重举行。住房和城乡建设部IC卡应用服务中心陈超华、王鑫、张昕,舟山市政府戴登禄副秘书长、市人力社保局张伟副局长、市经信委康专副主任、市民卡项目组全体同志以及新组建成立的城市一卡通公司有关负责人出席大会。

        在密钥生成仪式上,戴登禄副秘书长、张伟副局长、市经信委康专副主任和公司负责人张华,先后在计算机上录入各自书写的密码和口令,生成4张领导卡。在住房和城乡建设部IC卡应用服务中心工程师的引导操作下,又通过4张领导卡生成了舟山“城市一卡通”城市业务总控密钥。随后,4张领导卡和总控密钥被妥善封存。

        戴登禄秘书长代表舟山市政府致词,指出:“建设事业IC卡密钥管理系统”舟山城市密钥生成是舟山市民卡工程建设的一件大事,也是舟山数字城市建设的一件实事,标志着舟山市正式完成申领了包括人民银行、社保部密钥在内的三套密钥体系,标志着舟山市民卡工程建设的整体基础工程顺利完成。

        据悉,建设事业IC卡密钥管理系统是由住房和城乡建设部统一管理、统一授权、统一配发的安全管理系统,是保障IC卡项目安全及将来与城市其他领域IC卡互联互通应用的核心。住房和城乡建设部IC卡密钥应用范围广,在公交、景点、个人缴费等领域广泛应用,全国一共有147个城市采用该标准,给市民日常工作生活带来很大方便。该密钥系统代表着一个行业标准,一个城市只发一套,具有唯一性。城市级密钥系统的成功生成为今后舟山一卡通项目的拓展应用以及与周边省市互联互通奠定了基础,也将大大提升舟山城市数字化管理水平。
    展开全文
  • 版本控制或源代码管理系统是软件开发必备的。本文为您介绍9款优秀的开源版本控制系统,它们在软件行业已经得到了广泛应用。  1.Subversion  Subversion是一个开源的版本控制系统。由CollabNet公司首创于...
  • 【C语言】学籍管理系统

    万次阅读 多人点赞 2018-06-03 22:34:28
    C语言 – 学籍管理系统 功能简介 链表实现基本的创建增删改查。 成绩分析,链表的冒泡排序。 分管理员,老师,学生三端管理,密码的修改,加密。 分班级管理老师学生。 方框界面,↑↓键控制,ENTER...
  • CRM客户关系管理系统

    千次阅读 2018-11-29 17:05:04
    客户关系管理系统(CRM)是以客户数据的管理为核心,利用信息科学技术,实现市场营销、销售、服务等活动自动化,并建立一个客户信息的收集、管理、分析、利用的系统,帮助企业实现以客户为中心的管理模式。客户关系...
  • http://www.dzsc.com/data/html/2010-11-24/87326.html   密钥管理系统(Key Management System),也简称KMS,是IC项目安全的核心。如何进行密钥的安全管理,贯穿着IC卡应用的整个生命周期。  非接触C
  • 信息系统项目管理--上午分析笔记

    万次阅读 2019-10-29 10:22:29
    信息系统项目管理–上午分析 软件度量:项目度量、产品度量、过程度量 RBAC基于角色的访问控制,用户只能被动接受,不能自主决定,也不能自主的将访问权限授予其他用户。 运维管理平台使运维自动化、操作化,但并不...
  • C#桌面办公应用-工资管理系统系列五 接前文系列四,本文将讲解实现工资管理系统的代码的层次结构。主要采用的是MVCS模式的代码层次结构,视图层(V):是各种winform窗体;控制层(C):主要是winform窗体中各种控件的...
  • 项目简介: 项目基于javaEE平台,B/S模式开发。 使用Struts2、Hibernate/Spring3进行项目框架搭建。 使用Struts中的Action 控制器进行用户访问控制。 持久层使用Hibernate框架...使用Spring IOC容器管理所有的Actio
  • MFC课程设计 --学生成绩管理系统

    万次阅读 多人点赞 2018-07-26 21:12:55
    MFC课程设计 ,C++课程设计 --学生成绩管理系统 ps:因为课设完成的过程大家都不太一样,以下的代码仅供学习一下在MFC下各个控件的用法,有问题欢迎留言讨论。     实验目的 使用MFC类库编制应用程序:按钮...
  • 2011年上半年 信息系统项目管理师 上午试卷 (考试时间 9 : 00~11 : 30 共 150 分钟) 1. 在答题卡的指定位置上正确写入你的姓名和准考证号,并用正规 2B 铅笔在你写入的准考证号下填涂准考证号。 2. 本试卷的...
  • ●在计算机系统中,(3)是指在CPU执行程序的过程中,由于发生了某个事件,需要CPU暂时中止正在执行的程序,转去处理该事件,之后又回到被中止的程序。 (3)A.调用 B.调度 C.同步 D.中断 ●掉电后存储在(4)中...
  • 第三章城市智慧交通管理服务平台系统方案设计 3.1系统构成 按照信息获取的方式、传递及使用情况,可以把城市智慧交通管理服务综合信息服务平台系统划分为4 个层次: 基础层、功能层、共享信息层和服务层。在...
  • 涉密信息系统建设管理

    千次阅读 2019-12-11 13:11:41
    涉密信息系统“三员”是指系统管理员、安全保密管理员和安全审计员。系统管理员主要负责系统的日常运行维护工作;安全保密管理员主要负责系统的日常安全保密管理工作,包括用户账号管理以及安全保密设备和系统所产生...
  • PHP新闻管理系统(包括前台后台)

    万次阅读 多人点赞 2018-06-24 22:29:45
    一、 题目基于PHP的新闻发布系统二、 需求分析1、 软件功能新闻发布系统(News Release System or Content Management System)又叫做内容管理系统CMS(Content Management System),是一个基于网络的新闻发布和...
  • 【信息系统项目管理师】第二十二章 信息系统安全管理(考点汇总篇) 考点分析与预测 信息安全为高级科目独有的章节,在第三版教材中有66页的内容。需要掌握的知识点非常多,且知识点非常散,在考试中上午一般考察4...
  • CA系统的同及多技术

    千次阅读 2010-10-13 14:35:00
    CA系统的同及多技术目前,全球在数字电视的CA(Conditional Access:条件接收)技术方面,流行着两大标准,即美国的ATSC(Advanced Television Systems Ccommittee:先进电视系统委员会)标准和欧洲的DVB...
  • 测试后台管理系统思路和方法

    万次阅读 多人点赞 2019-08-01 14:02:53
    每个公司不管做什么业务,开发网站,app或者公众号亦或小程序,但凡涉及到用户信息或者订单信息都有对应的后台管理系统,所以每个测试人员基本上都有测试过后台管理系统的经验,但是后台管理系统测试不仅仅是基本的...
  • 第一章信息系统基础知识 1.信息与信息化定义,信息传输模型 诺伯特维纳:信息就是信息,既不是物质也不是能量。信息论创始人。 克劳德香农:信息就是不确定性的减少。信息化奠基人。信息就是用来消除不确定的东西...
  • 信息系统项目管理师学习笔记

    千次阅读 多人点赞 2019-03-30 14:34:08
    信息系统项目管理师学习笔记 信息化从小到大分为以下5个层次: 产品信息化、企业信息化、产业信息化、国民经济信息化、社会生活信息化 国家信息化体系包括6要素: 1、信息技术应用 2、信息资源 3、信息网络 4、信息...
  • 开源系统管理资源大合辑

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

    万次阅读 2007-11-27 11:22:00
    · 物流系统规划报告 项目管理系统设计 项目管理相关文档 OA 系统需求分析 OA 系统详细设计 人力资源系统设计 数据库设计报告 [CRM 词汇大全][彩信业务原理] [微软内容服务器介绍] [软件项目开发技能要求] [UML 用...
  • 应用系统安全管理

    千次阅读 2017-04-05 17:12:22
    应用系统的安全管理 1 身份鉴别 1.1 应用系统采用专用的登录控制模块
  • 信息系统项目管理师知识要点

    千次阅读 2015-12-05 14:43:04
    信息系统项目管理考试要点
  • 用java的swing组件实现简易的图书管理系统

    万次阅读 多人点赞 2018-01-14 15:30:07
    图书管理系统在生活和学校中是最为常见的,这学期的java课程设计题目中的其中一个就是实现图书管理系统, 做完课设后,在此记录下。 我的图书管理系统一共分为几个模块。图书查询模块,管理员模块(默认只有一个...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 190,580
精华内容 76,232
关键字:

密控系统管理客服