用户是应用的访问者,同一个应用不同的用户看到的报表信息是不同的,比如销售经理可以查看所有销售员的销售信息,而销售员则只能查看他本人的销售信息,所以就有必要对访问应用的用户进行管理。
用户管理可以新增访问应用的用户,可以给用户设置对应的机构,也可以给用户设置DQL宏和报表参数来控制用户对报表的访问权限。机构与通常所说的用户组相同,可将访问应用的用户信息,划分到不同的机构组。建立机构组的好处是可以为组里的所有用户统一定义访问报表的权限、设立统一的参数初始值,以控制他们访问报表时的数据。
创建机构:
添加机构时需以系统自带的超级管理员登录,超级管理员的用户名/密码为admin/a000000。
添加机构,编辑机构名为“副总裁”,设置基础权限、数据源权限、报表管理权限以及节点显示权限。
基础权限——设置该机构下的用户登录系统后,是否可以显示报表管理、查询分析管理、用户管理按钮。
上图中对副总裁机构的基础权限做了控制,勾选了“显示查询分析管理按钮”。使用副总裁机构下的用户登录报表中心,查询分析管理按钮可以显示,报表管理和用户管理按钮不显示。
数据源权限——设置远程服务时对数据源的访问权限。
上图中对副总裁机构的数据源权限做了控制,勾选“dqldemo”数据源。在报表设计器中通过远程服务访问报表中心,使用副总裁机构下的用户登录后,可以在数据源窗口看到dqldemo数据源。
报表管理权限——既能控制报表管理中目录的使用,还能控制远程服务对报表中心目录的访问。读控制文件的读取和下载;写控制文件的编辑权限;删控制文件的删除权限。
报表文件目录设置的权限对除了.splx/.spl/.dfx之外的其他报表相关文件(rpx、rpg、xls、xlsx、txt等)都有控制作用。
集算器文件目录设置的权限只对.splx/.spl/.dfx文件有控制作用。
上图中对副总裁机构的报表管理权限做了控制,将报表文件目录中“00Dashboard”目录的可用状态改为on,勾选了读写复选框。在报表设计器中通过远程服务访问报表中心,使用副总裁机构下的用户登录后,在左侧节点中看到有读权限的“00Dashboard”目录列出,该用户可以对这个目录进行读和写操作。
远程服务的使用可参考远程上传报表小节。
报表/集算器文件目录可通过按钮添加/删除目录,目录名称也可以随意定义。下图所示的这些默认已有的目录是报表中心用来存放demo示例的目录。
节点显示权限——设置该机构下的用户可以查看的报表显示节点。
注:针对某个节点的访问权限,若勾选某个用户则表示该用户不能访问该节点。
上图中对副总裁机构的节点显示权限做了控制,勾选了“Dashboard”分类夹下的3个报表节点。使用副总裁机构下的用户登录报表中心,在左侧节点树中可以看到Dashboard分类夹下的3个报表节点,可以查看预览报表结果。
注:只需要对叶子节点设置节点显示权限。
选中一个叶子节点,例如“手机销售分析”,即可以设置该机构下的所有人有访问权限,也可以设置该机构下的特定用户禁用访问权限。
此时销售代表机构下的所有用户(张颖、李芳)都对手机销售分析节点有访问权限。
此时销售代表机构下的用户,张颖对手机销售分析节点没有访问权限。
设置:
使用机构名称作为参数:勾选后,管理员为机构设置一个参数并跟随机构,若报表中使用到此参数,预览报表时则会自动匹配此参数的机构名称。
例如:
报表中设置参数grp
勾选【使用机构名称作为参数】并设置参数名称为grp
使用不同机构的用户登录,查看设置参数的报表,显示的参数不同
使用用户名作为参数:勾选后,管理员为用户设置一个参数并跟随用户,若报表中使用到此参数,预览报表时则会自动匹配此参数的用户名。
例如:
报表中设置参数un
勾选【使用用户名作为参数】并设置参数名称为un
使用不同的用户登录,查看设置参数的报表,显示的参数不同
新增文件目录:
报表/集算器文件目录可通过按钮新增文件目录添加目录,目录名称可随意定义。
创建用户:
通过上面创建机构的介绍我们已经了解如何新建角色和分配角色权限。那么,接下来我们学习如何管理用户并且为用户分配权限。
在“用户管理”界面,点击【添加】按钮,创建新用户。
(1) 新用户默认初始密码为a000000。
(2) 用户支持同时设置多个角色。当设置多角色时,用户权限是多个角色权限的总和。
(3) 产品缺省有一个普通用户raq_visitor,该用户不可删除。为方便演示,通过报表设计器工具栏按钮访问报表中心时,会默认以raq_visitor用户登录,无需手动登录。
设置:
启用登录验证码:勾选后,用户登录时需输入验证码。
密码必须包含特殊字符:勾选后,修改管理员/个人密码时,新密码需由6-10位数字、大小写字母和特殊符号组合成,特殊符号包括:!@#$%^&*,.等字符。不勾选时,新密码需由6-10位数字字母组合成。
不允许其他端点再次登录相同账号:默认同一个账号可在多个端点同时登录。勾选此选项时,一个账户只能在一个端点登录。此功能仅针对除超级管理员、管理员和访客外的其他普通用户。
添加管理员用户和普通用户后,会使用缺省密码a000000,用户登录后可通过个人密码菜单随意修改个人密码。
假设某用户忘记了自己的个人密码,有以下两种方式重置密码:
1、可通过超级管理员重置该用户的密码为初始密码。超级管理员拥有修改超级管理员密码和强制重置其他用户密码的权限。
2、可通过登录页中的【密码重置】进行重置密码,重置后的密码为初始密码a000000。(注:(1)重置密码需设置【任务】-【发件邮箱】,以及重置用户需要填写正确的收件邮箱;(2)超级管理员或管理员也可以通过这种方式重置密码。)
仅普通用户有用户个人信息管理功能。
普通用户可通过用户个人信息添加和修改个人的邮箱和电话,解除绑定的微信号。
锁定用户是指在规定时间内,为防止非法用户尝试高频登录(某个用户在某个时间内频繁登录n次),保护账户的安全而将此账户进行锁定,使其在一定时间内不能再次使用此账户。
锁定时长:代表失败后的锁定时间,单位为分钟。
间隔时间:设置此功能检查的窗口期,也就是n分钟之内输入错m次,就会锁定,这里n代表间隔时间,单位为分钟。
间隔时间内登录失败次数:设置间隔时间内的登录失败次数。
报表中心默认会将机构/用户信息存在xml文件中,为了方便客户对机构/用户信息的引入与管理,程序增加了从数据库存储机构/用户信息的方法。客户可通过自定义机构管理类继承com.raqsoft.center.CachedRole抽象类,并实现com.raqsoft.center.RoleManagerInterface接口;自定义用户管理类继承com.raqsoft.center.AbstractDefaultUserManager抽象类,并实现ProxyUserManagerInterface接口,来自主实现数据库存储功能,方便在任意数据库来储存机构和用户信息。
配置方法如下:点击 设置 菜单添加数据库机构-用户管理信息:
数据库工厂或命名空间:数据源名称,该数据源需在WEB-INF/raqsoftConfig.xml中添加
用户管理类全限定名:继承com.raqsoft.center.AbstractDefaultUserManager抽象类,并实现ProxyUserManagerInterface接口的类路径
机构管理类全限定名:继承com.raqsoft.center.CachedRole抽象类,并实现com.raqsoft.center.RoleManagerInterface接口的类路径
用户表名:配置存储用户信息的表
用户表从表名:配置存储用户信息对应DQL宏的表
机构表名:配置存储机构信息的表,包含基础权限和节点访问权限
机构数据源权限表名:配置存储机构信息对应数据源权限的表
机构路径权限表名:配置存储机构信息对应报表管理权限的表
举例1:用户管理类
下面我们以mysql数据源为例介绍用户管理类,自定义一个com.raqsoft.center.DBUserManager类,该类继承了com.raqsoft.center.AbstractDefaultUserManager抽象类,并实现ProxyUserManagerInterface接口。作用就是通过规定一个数据源、提供两个数据表名(有规定构造的),并让应用加载此类为用户管理类,实现用户在数据库存取。
为方便用户参考,程序默认将com.raqsoft.center.DBUserManager示例类存储在[安装根目录]\report\doc\zh目录下的center.zip中。
在mysql数据库中执行如下脚本:
t_rq_user和t_rq_userdqlmacro表名称的命名可以自定义,在配置页面同步设置即可,表字段结构不可修改,需与下面表字段结构一致。
CREATE TABLE `t_rq_user` (
`userId` int NOT NULL AUTO_INCREMENT,
`userName` varchar(45) NOT NULL,
`roleId` varchar(45) DEFAULT NULL,
`password` varchar(45) DEFAULT NULL,
`phone` varchar(45) DEFAULT NULL,
`email` varchar(45) DEFAULT NULL,
`reportParams` text DEFAULT NULL,
`wxid` varchar(45) DEFAULT NULL,
`wxnickname` varchar(45) DEFAULT NULL,
`secret` varchar(45) DEFAULT NULL,
`roleIds` varchar(45) DEFAULT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
插入2个预留用户:王伟、raq_visitor
INSERT INTO `t_rq_user` VALUES (1,'王伟','','47DA9D7366792CCA5C5B8EC1C431F49D','13439693532','460778537@qq.com',NULL,NULL,NULL,NULL,'2');
INSERT INTO `t_rq_user` VALUES (2,'raq_visitor','',' 82273A6BA2126D3AF24CE2D0CB0AF515','','',NULL,NULL,NULL,NULL,'-1');
CREATE TABLE `t_rq_userdqlmacro` (
`userId` int NOT NULL,
`params` varchar(45) DEFAULT NULL,
`vsb` text,
`conditionId` varchar(45) DEFAULT NULL,
`dataSource` varchar(45) DEFAULT NULL,
`filters` text DEFAULT NULL,
PRIMARY KEY (`userId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
如上述脚本所示,在mysql库t_rq_user表中插入了用户王伟和raq_visitor的信息,通过下图配置,管理员登录就会在用户管理菜单看到王伟和raq_visitor用户。可对他们进行与初始报表中心一样的用户编辑操作。王伟和raq_visitor用户可以正常使用报表中心,而报表中心默认存储用户信息的xml文件中的用户信息都会失效(不删除,但是会失效)。
注意:
设置数据库用户管理后,使用数据库中已有的用户登录时,登录密码必须按照数据库中定义的密码登录。
通过INSERT语句插入到数据库的用户,需要管理员admin登录报表中心查看一下用户列表,才可以刷新查询用户列表的缓存,此时插入的数据库用户才可以成功登录。
举例2:机构管理类
下面我们还是以mysql数据源为例介绍机构管理类,自定义一个com.raqsoft.center.DBRoleManager类,该类继承了com.raqsoft.center.CachedRole抽象类,并实现com.raqsoft.center.RoleManagerInterface接口。作用就是通过规定一个数据源、提供三个数据表名(有规定构造的),并让应用加载此类为机构管理类,实现机构在数据库存取。
为方便用户参考,程序默认将com.raqsoft.center.DBRoleManager示例类存储在[安装根目录]\report\doc\zh目录下的center.zip中。
在mysql数据库中执行如下脚本:
t_rq_role、t_rq_dsauth和t_rq_dirmode表名称的命名可以自定义,在配置页面同步设置即可,表字段结构不可修改,需与下面表字段结构一致。
CREATE TABLE `t_rq_role` (
`id` int NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
`noderights` text,
`u_button` tinyint DEFAULT NULL,
`r_button` tinyint DEFAULT NULL,
`f_button` tinyint DEFAULT NULL,
PRIMARY KEY (`id`)
) AUTO_INCREMENT=2;
插入2个预留角色:访客、管理员
INSERT INTO `t_rq_role` (id ,name, noderights, u_button ,r_button, f_button) VALUES (-1, '访客', NULL, 0, 0, 0 ), (1, '管理员', NULL, 0, 0, 0 );
CREATE TABLE `t_rq_dsauth` (
`roleId` int NOT NULL,
`ds` varchar(45) DEFAULT NULL
);
CREATE TABLE `t_rq_dirmode` (
`roleId` int NOT NULL,
`dir` text,
`type` int DEFAULT NULL,
`mode` int DEFAULT NULL
);
如上述脚本所示,在mysql库t_rq_role表中插入2个预留角色访客、管理员信息,通过下图配置,管理员admin登录后可以在机构管理菜单下看到访客和管理员角色,可以像初始报表中心一样对机构进行编辑操作。此时机构信息来源于数据库,而报表中心默认存储机构信息的xml文件中的机构信息都会失效(不删除,但是会失效)。
注意:
设置数据库机构管理后,最好插入2个预留角色访客、管理员,方便后续管理。
单点登录是目前比较流行的企业业务整合的解决方案之一。在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
比如小张在公司需要登录应用1和应用2,打开了应用1的登录界面,完成登录;之后再打开应用2,应用2通过令牌系统得知小张已经登录过了,则不用在输入口令,可直接进入应用内。这里令牌系统是客户公司内部的令牌系统。
为方便客户更好的体验报表中心,我们为报表中心提供了接入令牌系统的能力,这个单点登录设置就是用来把报表中心接入到客户单点登录令牌系统。
单点登录的实现方式有不只一种,我们针对最常见的方法做了接口。为客户提供了一种能够接入到支持http协议的远程令牌中心的接口,并在本地将令牌存入cookie,实现按域共享登录状态。
点击“设置”进入“单点登录”编辑界面:
上图示例中的校验令牌url:http://127.0.0.1:8080/token/testsso?action=1&token={0};登出url:http://127.0.0.1:8080/token/testsso?action=2&username={0}&token={1}。
url中{0}{1}…代表占位符,会被报表中心替换成对应的值。比如登出url使用{0}{1},会被替换成输入的用户名和密码,需要几个参数,这里我们就给了几个占位符。使用时要严格按规则填写。
启用:是否启动单点登录功能;
登录页:单点登录系统的首页登录界面,必填;
获取令牌url:子系统向令牌中心获取令牌的url配置,必填。比如:http://localhost:8080/auth/get?redirect=http://localhost:6868/demo/raqsoft/center/ssoActivate.jsp;
校验令牌url:每个用户登录后,都会生成一个token标记,通过校验url将token传递给令牌中心,验证通过后则无需输入用户名密码,直接登录,同时令牌中心会返回用户名给报表中心应用;
登出url:退出应用时使用,用于关闭令牌中心的登录状态。此时并不会导致正在使用的应用登出。只是当应用再需要验证时,去令牌中心取不到token了,需要用户名密码重新登录;
请求方式:post/get;
cookie名称:可任意指定,用于为当前网页定义名字,方便报表中心及其他应用的认识;
cookie生效路径:域名后跟的路径。同路径命名下cookie才能互通使用,/代表应用根目录;
coolie作用域:cookie有作用域设置,也就是不能跨域使用。比如设置域为testsso.com,那么这个cookie仅可以在访问***.testsso.com相互传递过去。
举例:
原理:报表中心提供一个免密登录的接口。接口目前已经做成了一个jsp,位于[安装根目录]/report/web/webapps/demo/raqsoft/center/ssoActivate.jsp,需要用户名username参数和access_token两个参数。
1.客户配置校验url
url包括两部分:
1) 客户的校验登录url,这个是客户自己系统的,如http://xxx/getauth。这个地址用于校验请求者的登录状态,并根据redirect参数重定向,给拼上username和access_token。
access_token 串说明:
如果客户系统需要反向验证,则需要access_token串;
如果客户系统不需要反向验证,access_token可以随便写一个或者不传,不传的话要改下ssoActivate.jsp 中的代码,对access_token长度串的判断。
2)redirect参数,返回到报表中心执行免密登录的接口url(如redirect= http://yyy/raqsoft/center/ssoActivate.jsp)
客户系统获取令牌url要redirect到报表中心的ssoActivate.jsp时,拼接参数默认用井号(#)解析。
完整url如:http://xxx/getauth?redirect=http://yyy/raqsoft/center/ssoActivate.jsp
2.报表中心,admin登录后,设置里面启用单点登录,填写登录页和获取令牌url
3.在客户的应用中,添加跳转子应用报表中心的url,http://yyy/reportCenterServlet?action=91
4.使用时点击3中配置的链接,就可以实现报表中心登录跳转。流程是:消息发给1中配置的地址,客户自行校验用户,通过后拼接用户名、token码,转发回ssoActivate.jsp,报表中心根据用户名免密登录。
每个用户可能给ssoActivate.jsp返回的参数不同,那么在ssoActivate.jsp中可以对逻辑进行修改
报表中心默认将用户信息存储在WEB-INF/reportCenter.xml中,很多时候用户不仅想在报表中心后台管理添加用户,还想批量将存储在外部文件或数据库中的用户信息导入到报表中心。为满足这种需求,报表中心提供了批量导入的方法。
需要调用报表中心提供的com.raqsoft.center.util.UserImporter类的importUsers方法。
方法介绍:
importUsers
语 法: public void importUsers(List<User> importUsers, String defaultPassword, boolean idAutoIncrease, String roleRulesFilePath, String configFilePath)
参数说明: importUsers - 需要引入的用户对象集合
defaultPassword - 引入用户默认密码
idAutoIncrease - id自增,若为false则使用用户对象中的id。代码中id不查重,尽量使用自增。用户名查重,会跳过重复。
roleRulesFilePath - 角色名称对应规则。此参数为一个txt文件的全路径,在该文件中应该设置当前引入用户对象的roleId属性和报表中心角色名称的对应关系。
configFilePath - 需要修改的报表中心配置文件的全路径
功能说明: 修改WEB-INF/reportCenter.xml文件,引入用户
Returns : 无
◆ 代码示例
为方便用户参考,程序默认将com.raqsoft.center.util.UserImporterExample示例类存储在[安装根目录]\report\doc\zh目录下的center.zip中。
package com.raqsoft.center.util;
... ...
import com.raqsoft.center.util.UserImporter;
public class UserImporterExample {
//通过api批量导入用户
//api用于将用户导入到报表中心的xml中存档
public static void main(String[] args) throws Exception {
String configFilePath = " C:\\Users\\runqian\\Desktop\\reportCenter.xml ";
//导入的用户需要遵守报表中心的用户设计,以下User对象都是指com.raqsoft.center.entity.User
UserImporter importer = new UserImporter();
//importUsers User对象集合 在java代码中自定义 以下举例
List<User> importUsers = new ArrayList<User>();
//以下例子是给定值,实际可以从某库中取出自己要导入的用户群体和角色
//new user 参数对应 id name roleId password
//示例中用户编号为自增id,并给定password填为null,密码为null时,程序默认用a000000
//roleId原本代表角色id,这里导入我们借用这个属性作为来源角色的角色名
//如果报表中心中没有这样的角色名,可以自动生成,或根据roleRulesFilePath映射成已有的角色
//原xml中没有添加的角色时,会新建
importUsers.add(new User(null, "张三", "初级工程师", null));
... ...
//原xml中没有这三个角色,但是rule文件中有对应关系,会映射
importUsers.add(new User(null, "王五", "二级销售", null));
... ...
//原xml中有这个角色时,直接匹配
importUsers.add(new User(null, "小刘", "销售经理", null));
//新导入用户的默认密码,如果设置,导入用户统一为此密码
String defaultPassword = "a000000";
//自增id
boolean idAutoIncrease = true;
//客户设定的role
String roleRulesFilePath = "C:\\Users\\runqian\\Desktop\\rule.txt";
importer.importUsers(importUsers, defaultPassword, idAutoIncrease, roleRulesFilePath, configFilePath);
}
}