Skip to end of metadata
Go to start of metadata

概述

BDF权限模块采用Spring Security3实现,并对Spring Security3作了一定的扩展,经过扩展之后使用者即使完全不了解Spring Security3也可以快速上手,利用Spring Security3来保护我们的业务系统。

BDF权限模块采用以角色为中心的授权体系,一方面角色与资源对应(资源包括URL、模块、组件以及用于进行数据权限控制的资源等),一个角色可对应多个资源;另一方面角色与用户、部门、群组对应,一个角色可以对应多个用户、部门或群组,同时对于放入角色当中的用户、部门、群组可以设置这个角色成员在当前角色中的访问权限(允许还是拒绝访问),如果当前成员(用户、部门、群组)在当前角色中访问权限为允许访问,那么就可以访问当前角色对应的资源,否则就不能访问当前角色对应的资源,利用这种特性就可以很容易的实现权限的加减计算。资源、角色以及角色成员(用户、部门、群组)它们之间的关系如下图所示。

从上图当中可以看到,角色可以与URL资源、模块资源、数据权限控制资源三种类型的资源对应,同时角色当中对应的成员可以有用户、部门、群组三种类型。如果用户在角色当中访问权限为允许那么该用户就可以访问当前群组对应的资源;如果部门在角色当前访问权限为拒绝,那么该部门以及该部门子部门中所有用户都不可以访问当前角色对应的资源;群组是一个容器,当前存放的是用户与部门,所以如果群组在角色当中访问权限为是,那么该群组当中的用户或部门就可以访问当前角色对应的资源。

在BDF权限实现当中,对于系统资源(URL资源、模块资源或数据权限控制资源)保护,系统首先判断当前资源有没有与角色对应起来,如果对应起来,那么只有该角色当中明确声明可以访问的成员(用户、部门、群组)才能访问当前角色对应的资源,其它一概不允许访问。当某个登录用户要访问某个受保护的资源时(当前资源与某个角色对应起来),系统首先判断当前登录用户是否在该资源对应的角色成员当中,如果在其中且允许访问该角色中资源,那么就允许该角色访问目标资源;如果在角色当中,但不允许访问角色中资源,那么该用户就不能访问目标资源。如果当前用户不在该资源对应的角色当中,就判断当前用户所属部门是否在该资源对应的角色当中,如果在其中的,那么首先判断当前用户所在部门的上级部门能否访问该角色对应资源,如果当前用户所在部门的所有上级部门中只要有一个不允许访问当前角色对应的资源,那么该用户就不允许访问当前资源;反之如果当前用户所在部门的所有上级部门都允许访问当前角色对应资源,那么就判断当前用户直属的部门能否访问当前角色对应资源,如果可以访问,那么用户就可以访问当前资源,如果不可以,那么用户就不能访问资源;如果当前用户所在部门不在当前角色当中,那么就判断当前用户是否在当前角色对应的群组当中(用户直接属于群组或用户在群组对应的部门当中),再采用与之前相同的逻辑来判断当前用户是否可以访问被保护的目标资源。

在BDF权限体系当中,允许对授权功能进行下放,默认情况下,只有在首选项属性administrator_usernames中的用户才能进行授权操作(也就是说默认情况下只有系统管理员才能进行授权动作,只有系统管理员才能对资源进行权限设置),所以授权功能下放,就是说系统管理员可以设置非系统管理员用户来进行管理权限,系统管理员可以选择权限管理员用户,同时可以给这个用户设置可操作的资源(URL、模块)及可操作的成员(可以给哪些用户或部门设置权限),这样,这个权限管理员登录后,通过权限管理界面就可以选择其可操作的资源给其可操作的成员(将这些资源访问权限赋给指定的成员)。如下图所示:

权限管理员登录后,通过权限管理界面,可以通过添加角色,为该角色设置可访问的资源(URL,模块,但只能是系统管理员设置的那些资源),同时还可以为角色添加成员(用户,部门,同样只能是系统管理员允许操作的用户和部门),如下图所示:

安装与配置

在完成第一节所做的工程配置的前提下,添加BDF权限模块是比较简单的,首先,需要在com.bstek.bdf.security-[version]/dbschema目录下找到与我们目前使用数据库吻合建表SQL文件,用来创建BDF权限模块运行所需要的数据库表权限模块所需要的表建好之后,接下来需要执行位于com.bstek.bdf.security-[version]/dbschema目录下的bdf-security-users-md5-init.sql或bdf-security-users-sha-init-default.sql文件,这两个SQL文件都是用来添加三个初始化用户的,之所以分两个文件,是因为他们密码采用的加密方式不同,bdf-security-users-sha-init-default.sql也是默认的,表示三个用户密码采用的是SHA的加密方式,而bdf-security-users-md5-init.sql文件中三个用户密码则采用MD5方式加密。

在第一节当中,我们介绍了名为bdf.passwordEncoder的系统属性,这个系统属性默认值为"org.springframework.security.authentication.encoding.ShaPasswordEncoder",表示用户密码采用SHA方式加密,所以这时我们需要执行bdf-security-users-sha-init-default.sql这个SQL文件添加用户,如果修改为"org.springframework.security.authentication.encoding.Md5PasswordEncoder",那就表示要采用MD5方式加密密码,所以要执行bdf-security-users-md5-init.sql文件。

无论执行哪个SQL文件,都向向系统的bdf_users表中新增三个名为user1/user2/user3的用户,密码与它们的用户名相同。

接下来我们需要将com.bstek.bdf.security-[version]/bin目录下的com.bstek.bdf.security-[version].jar文件复制到应用的WEB-INF/lib目录下,同时将依赖的第三方jar也复制到WEB-INF/lib目录下,jar复制完成之后我们需要修改web.xml,添加如下信息:

在这段配置当中,我们添加了一个名为springSecurityFilterChain的filter,这个filter是标准Spring Security3要用到的标志性的filter(BDF对其进行了包装),通过它实现业务系统资源的保护。

web.xml配置完成后,我们可能还需要对权限模块某些系统属性进行修改,比如设置登录页面是哪一个、哪些页面不用登录就可以访问、最大用户会话数等,与第一节介绍相同,如果需要覆盖其中某些属性,我们需要在工程的WEB-INF/dorado-home目录下放置一个名为bdf.properties的属性配置文件(如果已存在就不添加),将需要覆盖的属性放置其中即可。

权限模块允许覆盖的属性的如下表所示:

属性名

描述

bdf.security.casServerLoginUrl

如果采用CAS进行单点登录时,CAS Server的登录地址(需要修改bdf_preferences表中key为authentication_strategy属性值,只有该值为C时才会使用cas server进行单点登录)

bdf.security.casTicketCheckFilter

CAS单点登录成功之后跳转回客户端,客户端接收登录成功后的Ticket的地址,这个地址会收集CAS Server上产生的Ticket再到服务器端进行验证(需要修改bdf_preferences表中key为authentication_strategy属性值,只有该值为C时才会使用cas server进行单点登录)

bdf.security.casServer

CAS服务器地址。 (需要修改bdf_preferences表中key为authentication_strategy属性值,只有该值为C时才会使用cas server进行单点登录)

bdf.security.casServerLogoutUrl

通过CAS退出登录的地址。(需要修改bdf_preferences表中key为authentication_strategy属性值,只有该值为C时才会使用cas server进行单点登录)

bdf.security.loginFormUrl

本地登录时采用的登录页面地址。(需要修改bdf_preferences表中key为authentication_strategy属性值,只有该值为F时才会使用当前表单进行登录)

bdf.security.loginSuccessUrl

本地登录成功以后的跳转页面。

bdf.security.logoutSuccessUrl

本地退出以后的跳转地址

bdf.security.loginDefaultFailureUrl

本地登录失败以后的展示页面。

bdf.security.accessDeniedUrl

登录用户访问系统资源,但没有访问权限的提示页面。

bdf.security.expiredUrl

登录用户会话过期后的提示页面。

bdf.security.maximumSessions

用户同时登录的最大数量限制,如果为1,就表示如果用户在一台机器上登录后,又到另外一台机器上登录,那么之前登录的会话将过期;如果值为-1表示无限制。

bdf.security.SecurityContextRepository

用户会话信息的存放策略

bdf.security.cookieName

采用remember me功能登录时,客户端cookie的名称。

bdf.security.specialUrlAccessDefinition

权限系统当中,哪些URL需要进行特殊处理,这里提供了两种类型的特殊处理方式:一个是IS_AUTHENTICATED_ANONYMOUSLY,可以简写为A,表示对应的URL可以匿名访问,也就是不登录就可以访问,比如这里设置的login.jsp;另一个是IS_AUTHENTICATED_REMEMBERED,可以简写为R,表示哪些类型的URL可以通过remember me方式登录访问。设置的URL与处理方式之间用逗号(,)分隔,两组之间用分号(;)分隔。

bdf.security.clientLoginEncrypt

是否需要在登录时对登录的密码进行加密,然后再通过网络传输到服务端进行验证,该属性值默认为false,也就是在客户端密码传输到服务器进行验证时不进行加密。这里需要提出的是,一旦该属性值设置为true,那么服务端的密码在存储前首先需要对其进行纯粹的MD5加密,然后再采用MD5或SHA加上SALT进行二次加密存储在数据库表中,这样就极大的增加了用户密码的安全性

Labels
  • No labels