第1章 概述
SaCa Dataviz 是一个自助式可视化分析工具,而当在应用系统中需要使用本产品时,常常会面临与已有系统集成整合。
本文对DataViz集成中的若干话题一一介绍,部分篇幅较大的话题如CAS会另在其他文档中介绍。
第2章 应用集成
Dataviz应用分为前台的html页面和后台的REST接口服务,两部分是完全分离的,所以在整体应用层面,集成的方式可以分为两种:嵌入式集成和非嵌入式集成。
2.1 嵌入式部署
嵌入式集成就是把DataViz的工程与业务系统的工程在代码层面进行集成。DataViz是一个Web程序,属于B/S架构,并且是前后端分离的,前端使用Angular.js+Bootstrap实现,后端(服务端)使用SpringMVC5.3+Hibernate5.6框架实现。 虽然可以满足大部分部分的定制化需求,但是要把所有DataViz的内容都融合到业务系统中,除了需要融合各种配置文件,还需要解决不同版本的jar带来的各种冲突问题,集成成本非常高,日后的升级维护几乎不可行。所以我们是不推荐这种集成方式的。
2.2 非嵌入式部署
非嵌入式集成就是在系统功能层面进行集成,Dataviz与业务系统分开部署,也方便后续的升级和维护,我们比较推荐这种集成的方式。 非嵌入式的集成主要实现原理就是通过在业务系统页面中嵌套一个iframe,然后在iframe中引用想要显示的DataViz页面的URL。
这种集成方式共有两种实现思路:无需权限校验的集成和需要权限校验的集成。
2.2.1 无需权限校验的集成
无需权限校验的集成非常简单,DataViz中的图表和图册都是支持公开分享功能的,鼠标悬浮在资源块上,或者在资源编辑页面上方的toolbar 上,都能找到分享按钮,如下图:
通过公开分享功能我们就可以得到一个分享链接,如下图:
分享链接可以让我们在未登录的情况下访问资源,即:只要网络互通,有浏览器就可访问分享的资源。这样,在集成的时候只需要在系统页面的iframe中把URL这只为分享链接们就可以达到集成的效果。
【注意】分享功能为产品付费模块,产品默认不开放此功能。
需要权限校验的集成则复杂一些,首先需要对登录和身份认证进行集成,然后还需要对用户、组织和角色进行数据互通,具体细节和方法可以查看下面几个章节。
第3章 登录与身份认证
SaCa DataViz 的后台服务使用了标准的Spring Security实现的登录认证及会话管理,配置文件WEB-INF/conf/spring/applicationContext-security.xml 默认配置提供了用户名密码表单认证登录,及session状态维护。因此大体上可以按照一般Spring Security的方法进行登录和认证的集成。
3.1 独立部署下的登录集成
当DataViz后台独立于业务系统运行时,依赖实际使用场景需求以及DataViz与业务系统的会话集成程度不同,大致可以分为以下几种集成方式。
3.1.1 单一身份无登录集成
SaCa DataViz 中始终使用默认的身份,无需登录及身份认证,所有的访问在DataViz中都是唯一的匿名用户,DataViz内置的安全访问限制没有了效果,一般适用于一些不直接面向最终用户的场景。此方式集成最为简单,可直接使用DataViz自带提供的 nosecure 配置文件替代默认的applicationContext-security.xml即可完成。
3.1.2 简单URL登录集成
一些场景下,应用系统仅需要在特定位置访问DataViz中已定义好的特定的用户资源,而这些资源需要在已登录状态下使用,这种情况下可以采用简单URL用户名密码传参方式实现登录的同时访问目标地址。
3.1.2.1 使用
此功能需要修改配置开启。修改前台应用的config.js配置文件(路径:\dataviz-web\common\config.js),将urlLogin的值改为true。
urlLogin: false, //是否开启URL传参登录功能
默认状态下分享链接是不需要登录验证的,所以urlLogin配置不能控制分享链接。如果分享链接也需要登录验证需要开启看另一个配置:
sharePlayUrlLogin: false, //是否开启播放分享链接的传参登录功能
完成设置后,可以使用URL传参登录功能。只需在正常的访问连接中加入两个参数:loginname和token,例如:
默认访问链接:http://localhost:63342/dataviz_web/src/index.html?loginname=kangxi&token=HD8SJSK2J34K9J7JH5O8Y2TQ6
其中loginname为登录账号,token为登录令牌,用以校验登录账号是否可以合法登录, 两者不能同时为空 。该参数会被发送到后台服务,关于认证的处理方法请参见认证部分TokenValidator 验证。
3.1.3 第三方身份登录集成
在互联网应用场景中常常需要使用第三方身份形式登录系统,借助Spring Security提供的扩展能力,DataViz可以实现常见的第三方身份登录方式。具体内容可以参阅相应文档:
3.1.4 依赖业务系统的登录集成
一些场景下,SaCa DataViz 虽然直接面向最终用户,但是作为一个相对独立的附加功能使用,例如从一个门户系统跳转访问,此时SaCa DataViz虽然也需要区分的用户,但用户都是通过外部门户访问,并不直接访问DataViz应用。两者的会话关联并没有很强的联系,DataViz 需要借助业务系统的入口访问,此时可以采用一种相对简单的方法进行集成:在业务系统中完成登录后立即向DataViz后台接口发送认证请求,在DataViz中认证成功后自动完成登录。
3.1.4.1 实现
登录请求可以使用表单POST到 DataViz 服务 /login
接口,默认用户名参数为a,密码参数为p。传递后的身份认证处理请参见基于 DaoAuthenticationProvider 的认证 部分的说明。
3.1.5 单点登录集成
单点登录集成是最为全面的登录集成方式,它在业务系统和DataViz之外引入了第三方的单点登录系统,业务系统和DataViz都通过集成单点登录系统完成身份认证与登录,可以最大程度地保证应用系统和DataViz的登录状态一致,这也是需要和业务系统用户进行登录集成时DataViz推荐的登录集成方式。
目前,DataViz 已验证支持最好也是使用最多的单点登录系统是 Apereo CAS 单点登录系统。关于Apereo CAS 系统的介绍可以参考 Apereo CAS 单点登录系统使用介绍。DataViz提供了基于自身Spring Security的CAS集成方法,具体步骤请参见 CAS 单点登录集成。
3.2 嵌入式集成的登录
将DataViz嵌入到业务系统中,意味着两个系统技术匹配度较高,在登录会话层面上可以直接利用已有业务系统的登录,需要特殊注意的是DataViz后台是一个REST服务,所有接口均使用/service路径前缀,对于DataViz服务REST接口的认证拦截需要配置DataViz自带的返回HTTP 401,而不是业务系统中自己的设置。
由于这种集成方式非常少见,且使用这种方式的集成者应该对Spring Security的配置也较为熟悉,这里不再详细描述该方式的配置方法。
3.3 基本身份认证
身份认证是登录的步骤之一,主要用于独立、半独立部署时使用URL登录或依赖业务系统登录的情况,它在多数情况下会与用户集成相关,关于用户集成的部分请查看后续章节。
SaCa DataViz使用Spring Security处理登录时的身份认证,因此所有的身份认证的集成都是在Spring Security的框架内进行。
3.3.1 Spring Security 身份认证接口
Spring Security 身份认证机制的接口是org.springframework.security.authentication.AuthenticationProvider
它决定了认证的方法,对输入的认证Token进行验证,成功后返回一个包含用户登录信息的Authentication对象代表认证成功,若失败则抛出相应的异常。
其配置位于applicationContext-security.xml 的 <authentication-manager alias="authenticationManager"> ... </authentication-manager>
中。
它有两个常用的实现类是org.springframework.security.authentication.dao.DaoAuthenticationProvider
和 org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider
。
3.3.2 基于 DaoAuthenticationProvider
的认证
该接口是DataViz用户名密码表单登录时使用的实现。它会调用注入的 org.springframework.security.core.userdetails.UserDetailsService
对象获取用户身份相关信息 org.springframework.security.core.userdetails.UserDetails
, 然后使用UserDetails信息与用户输入的密码或Token进行比较验证。
3.3.2.1 UserDetailsService
public interface UserDetailsService {
/**
* @param username 登录名
*/
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
在进行身份验证集成时,集成者可以添加自己的UserDetailsService实现, 方法返回 UserDetails 对象(必须包含credential),并设置相应的角色,然后修改 applicationContext-security.xml中的 userDetailService bean的配置,实现登录用户信息的获取。但 如果需要DataViz和已有系统做用户集成,则应该实现用户集成接口的方式实现身份获取 ,这是DataViz更推荐的方式。
3.3.2.2 认证校验
取到身份信息后,需要做密码/Token比较验证,这里会使用到org.springframework.security.crypto.password.PasswordEncoder
接口。
public interface PasswordEncoder {
/**
* 加密方法,对传入的字符串进行加密,返回加密后的字符串
* @param 加密前的字符串
*/
String encode(CharSequence rawPassword);
/**
* 密码验证方法,比较加密前和加密后的字符串是否匹配
* 对rawPassword进行加密,在与encodedPassword比较
* @param 加密前的字符串
* @param 加密后的字符串
* @return
*/
boolean matches(CharSequence rawPassword, String encodedPassword);
}
DataViz自带的用户名/密码方式的验证使用的是 org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder
实现,如果集成时使用的密码是明文存储,可以配置为org.springframework.security.crypto.password.NoOpPasswordEncoder
,如果使用特定的规则,则可以添加自己的实现。
该配置在 applicationContext-security.xml 的 bcryptEncoder bean。
3.3.3 TokenValidator 验证
TokenValidator 验证是DataViz中内置提供的基于 Spring Security PreAuthenticatedAuthenticationProvider
认证接口实现的一种身份认证集成方式,它不针对特定地址进行登录验证,而是对所有后台请求地址,依据请求的参数名,调用自定义实现的身份验证逻辑,然后完成登录,最后继续原请求的内容。它目前在简单URL登录集成方法中被使用。
3.3.3.1 使用方法
需要编写一个 com.neusoft.saca.dataviz.authentication.springsecurity.filterlogin.usertoken. TokenValidator
(dataviz-security.jar) 的实现类:
public interface TokenValidator {
/**
* 身份验证,传入的参数对应请求中传入的两个参数
*/
public UserBO validate(String loginName, String token) throws Exception;
}
返回值中的属性:
属性 | 类型 | 是否可能为空 | 描述 | |
---|---|---|---|---|
id | String | 否 | 用户ID(唯一标识) | |
name | String | 是 | 用户名称 | |
role | Integer | 否 | 系统角色:0:普通用户,1:管理员,默认为0 | |
state | Integer | 否 | 状态,-1:无效,1:有效,默认为1 |
加入到后台服务后,于后台服务applicationContext-security.xml中添加bean配置:
<beans:bean id="tokenValidator" class="ValidatorImplementationClassName" />
其中 ValidatorImplementationClassName 为实现类的完整类路径。
3.3.4 基于 LDAP 的认证
除了上述两种方式外,实际集成时还常遇到用户信息存储于统一的LDAP目录服务上,需要基于目录服务中的信息进行用户认证的情景。此时仍然可以基于Spring Security的配置进行。
3.3.4.1 LDAP 服务器配置
于 applicationContext-security.xml 中启用以下配置添加 LDAP 目录服务器,其中 / 后面的路径指定顶级后缀,manager-dn 和 manager-password 为服务器访问的管理员用户名密码,如果匿名访问则应去掉:
<ldap-server url="ldap://ldap.server:389/dc=dataviz,dc=com" manager-dn="cn=manager,dc=dataviz,dc=com" manager-password="password" />
3.3.4.2 用户DN获取
认证时需要将用户登录输入的用户名映射为LDAP中的一个DN,Spring Security 支持两种方式进行映射,一种是简单替换拼接,一种是通过LDAP搜索。
3.3.4.2.1 简单替换拼接
当所有用户在LDAP中存储在同一节点下的层级时,可以使用这种映射方式,其配置方式为启用 authentication-manager 标签下的以下标签:
<ldap-authentication-provider user-context-mapper-ref="ldapUserDetailsContextMapper" user-dn-pattern="cn={0}" />
在该配置下,用户名会被替换到{0}位置,映射的DN为 cn=loginName,dc=dataviz,dc=com
。
3.3.4.2.2 LDAP 搜索
当不满足用户存储在同一节点下的层级时,可以使用LDAP搜索方式映射用户。其配置方式为启用 authentication-manager 标签下的 ldap-authentication-provider
标签,并进行如下修改( user-search-base
为可选 ):
<ldap-authentication-provider user-context-mapper-ref="ldapUserDetailsContextMapper" user-search-filter="(cn={0})" user-search-base="ou=people" />
在该配置下,使用的用户DN是通过在 ou=people,dc=dataviz,dc=com
下 LDAP 搜索 (cn=loginName)
的结果(结果不能为多个)。
3.3.4.3 密码比较验证
在以上配置下,已经可以通过登录名获取的用户DN及密码采用 LDAP bind 操作完成身份认证,这是一种简单有效的配置方式。
除 bind 方法外,Spring Security也支持另外两种验证方法:密码LDAP比较及本地比较。由于这两种方法都是在不做 bind 认证操作下直接对用户密码属性进行操作,通常服务器对密码的访问都会有安全限制,因此是相对不常用的验证方法。
LDAP 比较验证
LDAP 比较验证使用 LDAP compare 操作将验证输入的密码发送到服务器上指定的密码属性进行比较,从而判断是否验证通过。配置方法是在
ldap-authentication-provider
节点下,添加<password-compare>
节点,其中 password-attribute 属性指定密码属性名(默认为 userPassword):<password-compare password-attribute="userPassword"/>
本地比较
本地比较即将用户的密码属性从LDAP服务器上获取过来,然后在服务器上比较。配置方法为在
password-compare
下额外配置 password-encoder 标签(ref 属性指定一个org.springframework.security.crypto.password.NoOpPasswordEncoder
bean:<password-compare> <password-encoder ref="noOpPasswordEncoder" /> </password-compare>
<beans:bean id="noOpPasswordEncoder" class="org.springframework.security.crypto.password.NoOpPasswordEncoder"/>
3.3.4.4 关于管理员权限
在经过以上配置后,系统已经可以通过LDAP使用目录服务中的用户进行登录验证。在没有做用户集成时,所有的用户都会被认证为DataViz普通用户,而不会有管理员用户。DataViz默认提供的实现类提供了一种方法,可以在不做用户集成的情况下,通过检查目录服务中用户Entry属性的方式设置管理员(如果需要做用户集成则可以略过此节):如果其属性值中包含特定的属性值则认为是管理员,否则为普通用户。(也可以设置多个值,符合其中一个即可)方法是修改 ldapUserDetailsContextMapper
bean的配置,添加 adminAttributeName
及 adminAttributeValues
属性:
<beans:bean id="ldapUserDetailsContextMapper" class="com.neusoft.saca.dataviz.authentication.springsecurity.DefaultUserDetailsContextMapper">
<beans:property name="adminAttributeName" value="ou" />
<beans:property name="adminAttributeValues" value="administrators" />
</beans:bean>
如果已经做了用户集成,则会按用户集成后的用户信息确定管理员,此处的设置没有作用。
3.3.4.5 关于用户ID、组织机构与角色
在进行LDAP 登录后,用户ID默认即为用户的DN,而用户的组织机构及角色需要依靠用户、组织机构及角色的集成。使用LDAP登录,此时做集成时,当用户DN不会超过64个字符时,可以直接使用用户的LDAP DN作为ID。如果用户DN可能超过64个字符,那么支撑库可能无法记录超长的用户ID数据,此时应该使用其他更短的值(如RDN、UUID)作为用户ID。
在不使用用户DN作为ID的情况下,需要额外更换登录用的 ldapUserDetailsContextMapper
bean的实现类,继承 com.neusoft.saca.dataviz.authentication.springsecurity.DefaultUserDetailsContextMapper
类,重写其中的 getUserId 方法。
protected String getUserId(DirContextOperations ctx, String loginName) {
return ctx.getNameInNamespace(); // dn
}
3.4 无会话状态的身份验证
在DataViz独立、半独立部署方式下,除了最常见的会话登录方法外,由于使用的Spring Security安全框架,SaCa DataViz 也能够支持一些诸如基于JWT实现的无会话状态的身份验证。
集成基于如下思路:
- 将登录后的Token通过某种方式放到DataViz后台应用可访问位置,如Cookie中;
- 配置所有地址的
create-session
为stateless
,即不创建session; - 对所有配置了
stateless
的地址应用PRE_AUTH_FILTER
过滤,过滤器继承AbstractPreAuthenticatedProcessingFilter
,在实现中读取请求中包含的token,最后添加PreAuthenticatedAuthenticationProvider
实现完成token验证。
集成者可以以上思路手动实现,也可以利用 DataViz 内置的TokenValidator (基于PreAuthenticatedAuthenticationProvider
的实现)和Filter实现,集成时开发者可以视情况选择。
以下提供基于DataViz内置TokenValidator和Filter,从Cookie中读取验证Token的实现方法说明。
3.4.1 配置修改
修改applicationContext-security.xml文件:
- 将其中所有
create-session="ifRequired"
的配置替换改为create-session="stateless"
。 - 查看所有
create-session
为stateless
的http标签,确保其下含有配置<custom-filter position="PRE_AUTH_FILTER" ref = "preAuthenticatedFilter"></custom-filter>
,如果没有则复制添加到该标签元素下。 检查所有http
create-session
为stateless
的元素,确保其下不包含类似以下配置:<session-management …></session-management> <custom-filter position="SESSION_MANAGEMENT_FILTER" …> </custom-filter>
修改bean
preAuthenticatedFilter
,将class替换为com.neusoft.saca.dataviz.authentication.springsecurity.filterlogin.CookiePreAuthenticatedFilter
并去掉原property配置,改为 cookieName, cookiePath,cookieDomain,分别对应包含认证信息的cookie的名、路径及域。名字为必选,路径和域为可选。如果不写路径和域,则按名称匹配读取到的第一个cookie值。- 将编写的cookie验证类的类名替换到id为 tokenValidator 的bean下。
3.4.2 验证类实现
验证类利用TokenValidator,需实现 com.neusoft.saca.dataviz.authentication.springsecurity.filterlogin.validate.TokenValidator
接口,该接口仅包含1个方法:
UserBO validate(String loginName, String token)
当使用提供的cookie配置类时,只需使用loginName,其中的值为前台传到后台对应的cookie值。在验证通过后,需返回UserBO Java bean对象,包含验证成功的用户信息,若失败则可抛出异常。
UserBO对象主要属性:
/**
* 用户ID
*/
private String id;
/**
* 用户名称
*/
private String name;
/**
* 登录ID
*/
private String loginID;
/**
* 用户状态,1:有效,-1:无效
*/
private Integer state = STATE_NORMAL;
/**
* 用户角色,0:普通用户,1:管理员
*/
private Integer role = ROLE_USER;
/**
* 自定义参数,会传递到系统变量
*/
private Object customParams;
如果使用了自定义的Filter,则loginName对应Principal,token对应Credential。
第4章 用户集成
用户集成并不是所有集成的必需内容,如果在集成后需要在DataViz中使用用户、组织、角色相关功能,诸如用户管理、组织管理、角色管理、数据权限、公共项目、看板等功能时,则必须要进行用户集成。
4.1 用户集成
DataViz中提供了用户相关的接口,只要实现这些接口,并将其配置在applicationContext.xml中,DataViz就可以通过这些接口获取业务系统中原生的用户信息,并在Dataviz中正常使用用户的相关功能。
4.1.1 接口说明
接口名称:
com.neusoft.saca.dataviz.system.manager.UserManager
所在包:dataviz-system.jar
4.1.1.1 addUser
//新增用户信息
public String addUser(UserBO userBO);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
name | String | 否 | 用户名称 |
loginID | String | 否 | 登录账号 |
password | String | 否 | 登录密码(加密前) |
role | Integer | 否 | 系统角色:0:普通用户,1:管理员 |
state | Integer | 否 | 状态,-1:无效,1:有效 |
dataAnalysis | Integer | 否 | 是否使用数据预测功能,0:否,1:是 |
creatorId | String | 否 | 创建人ID |
返回参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 用户ID(唯一标识) |
4.1.1.2 modifyUser
//修改用户信息
public void modifyUser(UserBO userBO);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 用户ID(唯一标识) |
name | String | 否 | 用户名称 |
loginID | String | 否 | 登录账号 |
password | String | 否 | 登录密码(加密前) |
role | Integer | 否 | 系统角色:0:普通用户,1:管理员 |
state | Integer | 否 | 状态,-1:无效,1:有效 |
dataAnalysis | Integer | 否 | 是否使用数据预测功能,0:否,1:是 |
creatorId | String | 否 | 创建人ID |
4.1.1.3 removeUserById
//删除用户信息
public void removeUserById(String id);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 用户ID(唯一标识) |
4.1.1.4 getUserById
//根据用户ID查询单个用户信息
public UserBO getUserById(String id);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 用户ID(唯一标识) |
返回参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 用户ID(唯一标识) |
name | String | 否 | 用户名称 |
loginID | String | 否 | 登录账号 |
password | String | 否 | 登录密码(加密前) |
role | Integer | 否 | 系统角色:0:普通用户,1:管理员 |
state | Integer | 否 | 状态,-1:无效,1:有效 |
dataAnalysis | Integer | 否 | 是否使用数据预测功能,0:否,1:是 |
createTime | Date | 是 | 创建时间 |
4.1.1.5 getUserByLoginID
//根据登录账号查询单个用户信息
public UserBO getUserByLoginID(String loginID);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
userId | String | 否 | 用户ID(唯一标识) |
返回参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 用户ID(唯一标识) |
name | String | 否 | 用户名称 |
loginID | String | 否 | 登录账号 |
password | String | 否 | 登录密码(加密前) |
role | Integer | 否 | 系统角色:0:普通用户,1:管理员 |
state | Integer | 否 | 状态,-1:无效,1:有效 |
dataAnalysis | Integer | 否 | 是否使用数据预测功能,0:否,1:是 |
createTime | Date | 是 | 创建时间 |
4.1.1.6 changePassword
//修改登录密码
public void changePassword(String userId, String oldPwd, String newPwd);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
userId | String | 否 | 用户ID(唯一标识) |
oldPwd | String | 否 | 旧密码 |
newPwd | String | 否 | 新密码 |
4.1.1.7 getUsers
//查询全部用户信息
public List<UserBO> getUsers();
返回参数
返回用户信息列表,其中UserBO属性包括:
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 用户ID(唯一标识) |
name | String | 否 | 用户名称 |
loginID | String | 否 | 登录账号 |
password | String | 否 | 登录密码(加密前) |
role | Integer | 否 | 系统角色:0:普通用户,1:管理员 |
state | Integer | 否 | 状态,-1:无效,1:有效 |
dataAnalysis | Integer | 否 | 是否使用数据预测功能,0:否,1:是 |
creatorId | String | 否 | 创建人ID |
4.1.1.8 getPageUsers
(v5.6.02 版本之后新增)
/**
* 按页查询用户数据
*
* @param pageIndex 页码,从1开始
* @param pageCount 每页显示数量
* @param searchKey 查询关键字,默认为用户名或登录账号
* @return
*/
public List<UserBO> getPageUsers(int pageIndex, int pageCount, String searchKey);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
pageIndex | int | 否 | 页码,从1开始 |
pageCount | int | 否 | 每页显示数量 |
searchKey | String | 是 | 查询关键字,默认为用户名或登录账号 |
返回参数
返回用户信息列表,其中UserBO属性包括:
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 用户ID(唯一标识) |
name | String | 否 | 用户名称 |
loginID | String | 否 | 登录账号 |
password | String | 否 | 登录密码(加密前) |
role | Integer | 否 | 系统角色:0:普通用户,1:管理员 |
state | Integer | 否 | 状态,-1:无效,1:有效 |
dataAnalysis | Integer | 否 | 是否使用数据预测功能,0:否,1:是 |
creatorId | String | 否 | 创建人ID |
4.1.1.9 getUsersCount
(v5.6.02 版本之后新增)
/**
* 用户的数量,用来分页
*
* @param searchKey 查询关键字,默认为用户名或登录账号
* @return
*/
public int getUsersCount(String searchKey);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
searchKey | String | 是 | 查询关键字,默认为用户名或登录账号 |
返回参数
返回用户的数量
4.1.2 用户实体UserBO
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 用户ID(唯一标识) |
name | String | 否 | 用户名称 |
loginID | String | 否 | 登录账号 |
password | String | 否 | 登录密码(加密前) |
role | Integer | 否 | 系统角色:0:普通用户,1:管理员 |
state | Integer | 否 | 状态,-1:无效,1:有效 |
dataAnalysis | Integer | 否 | 是否使用数据预测功能,0:否,1:是 |
creatorId | String | 否 | 创建人ID |
4.1.3 配置
在applicationContext.xml配置文件中找到
<bean id="userManager" class="com.neusoft.saca.dataviz.system.impl.UserManagerImpl"></bean>
将com.neusoft.saca.dataviz.system.impl.UserManagerImpl
替换为新的实现类名称。
4.2 组织机构集成
DataViz中提供了组织机构相关的接口,只要实现这些接口,并将其配置在applicationContext.xml中,在DataViz中就可以通过这些接口获取业务系统中原生的组织信息,并且在Dataviz中正常使用组织机构的相关功能。
4.2.1 接口说明
接口名称:
com.neusoft.saca.dataviz.system.manager.OrgManager
所在包:dataviz-system.jar
4.2.1.1 addOrg
//新增组织信息
public String addOrg(OrgBO orgBO);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
name | String | 否 | 组织名称 |
description | String | 是 | 描述备注 |
parentId | String | 是 | 父级组织ID,如果为最上层组织,则允许为空;否则不可为空。 |
creatorId | String | 否 | 创建人ID |
返回参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 组织ID(唯一标识) |
4.2.1.2 modifyOrg
//修改组织信息
public void modifyOrg(OrgBO orgBO);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 组织ID(唯一标识) |
name | String | 否 | 组织名称 |
description | String | 是 | 描述备注 |
4.2.1.3 removeOrgById
//删除组织信息
public void removeOrgById(String id);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 组织ID(唯一标识) |
4.2.1.4 getOrgById
//查询单个组织信息
public OrgBO getOrgById(String id);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 组织ID(唯一标识) |
返回参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 组织ID(唯一标识) |
name | String | 否 | 组织名称 |
description | String | 是 | 描述备注 |
parentId | String | 否 | 父级组织ID。如果为最上层组织,则允许为空;否则不可为空。 |
4.2.1.5 getOrgsByUserId
//查询用户直属组织信息
public List<OrgBO> getOrgsByUserId(String userId);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
userId | String | 否 | 用户ID(唯一标识) |
返回参数
返回组织信息列表,其中OrgBO属性包括:
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 组织ID(唯一标识) |
name | String | 否 | 组织名称 |
description | String | 是 | 描述备注 |
parentId | String | 否 | 父级组织ID。如果为最上层组织,则允许为空;否则不可为空。 |
4.2.1.6 getUserIdsByOrgId
//查询组织下直属用户ID
public List<String> getUserIdsByOrgId(String orgId);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
orgId | String | 否 | 组织ID(唯一标识) |
返回参数
返回用户ID列表
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 组织ID(唯一标识) |
4.2.1.7 removeOrgOfUser
//移除组织和用户的关联
public void removeOrgOfUser(String orgId, String userId);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
orgId | String | 否 | 组织ID(唯一标识) |
userId | String | 否 | 用户ID(唯一标识) |
4.2.1.8 updateOrgUsers
//更新组织关联用户的信息
public void updateOrgUsers(String orgId, List<String> userIds);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
orgId | String | 否 | 组织ID(唯一标识) |
userIds | String | 否 | 用户ID列表(唯一标识) |
4.2.1.9 getAllOrgs
//查询全部组织信息
public List<OrgBO> getAllOrgs();
返回参数
返回组织信息列表,其中OrgBO属性包括:
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 组织ID(唯一标识) |
name | String | 否 | 组织名称 |
description | String | 是 | 描述备注 |
parentId | String | 是 | 父级组织ID,如果为最上层组织,则允许为空;否则不可为空。 |
4.2.1.19 getUserRoleByOrgId
/**
* 根据组织ID查询组织下直属的用户信息
*
* @param orgId
* 组织ID
* @return 用户ID -> 用户组织角色 ,0:普通用户,1:组织管理员
*/
public Map<String, Integer> getUserRoleByOrgId(String orgId);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
orgId | String | 否 | 组织ID(唯一标识) |
4.2.2 组织实体OrgBO
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 组织ID(唯一标识) |
name | String | 否 | 组织名称 |
description | String | 是 | 描述备注 |
parentId | String | 是 | 父级组织ID,如果为最上层组织,则允许为空;否则不可为空。 |
creatorId | String | 否 | 创建人ID |
4.2.3 修改配置
在applicationContext.xml配置文件中找到
<bean id="orgManager" class="com.neusoft.saca.dataviz.system.impl.OrgManagerImpl"></bean>
将com.neusoft.saca.dataviz.system.impl.OrgManagerImpl
替换为新的实现类名称。
4.3 角色集成
在DataViz中提供了角色相关的接口,只要实现这些接口,并将其配置在applicationContext.xml中,在DataViz中就可以通过这些接口获取业务系统中原生的角色信息,并且在Dataviz中正常使用角色的相关功能。
4.3.1 接口说明
接口名称:
com.neusoft.saca.dataviz.system.manager.RoleManager
所在包:dataviz-system.jar
4.3.1.1 addRole
//新增角色信息
public String addRole(RoleBO roleBO);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
name | String | 否 | 用户名称 |
description | String | 是 | 描述备注 |
creatorId | String | 否 | 创建人ID |
返回参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 角色ID(唯一标识) |
4.3.1.2 modifyRole
//修改角色信息
public void modifyRole(RoleBO roleBO);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 角色ID(唯一标识) |
name | String | 否 | 角色名称 |
description | String | 是 | 描述备注 |
4.3.1.3 removeRoleById
//删除角色信息
public void removeRoleById(String id);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 角色ID(唯一标识) |
4.3.1.4 getRoleById
//查询单个角色信息
public RoleBO getRoleById(String id);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 角色ID(唯一标识) |
返回参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 角色ID(唯一标识) |
name | String | 否 | 角色名称 |
description | String | 是 | 描述备注 |
4.3.1.5 getRolesByUserId
//查询用户所有的角色信息
public List<RoleBO> getRolesByUserId(String userId);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
userId | String | 否 | 用户ID(唯一标识) |
返回参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 角色ID(唯一标识) |
name | String | 否 | 角色名称 |
description | String | 是 | 描述备注 |
4.3.1.6 getUserIdsByRoleId
//查询拥有此角色的用户ID
public List<String> getUserIdsByRoleId(String roleId);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
roleId | String | 否 | 角色ID(唯一标识) |
返回参数
返回用户ID列表
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
Id | String | 否 | 用户ID(唯一标识) |
4.3.1.7 removeRoleOfUser
//移除角色和用户的关联
public void removeRoleOfUser(String roleId, String userId);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
roleId | String | 否 | 角色ID(唯一标识) |
userId | String | 否 | 用户ID(唯一标识) |
4.3.1.8 updateRoleUsers
//更新角色关联用户的信息
public void updateRoleUsers(String roleId, List<String> userIds);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
roleId | String | 否 | 角色ID(唯一标识) |
userId | String | 否 | 用户ID(唯一标识) |
4.3.1.9 getRoles
//查询全部角色信息
public List<RoleBO> getRoles();
返回参数
返回角色信息列表,其中RoleBO属性包括:
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
id | String | 否 | 角色ID(唯一标识) |
name | String | 否 | 角色名称 |
description | String | 是 | 描述备注 |
4.3.2 角色实体RoleBO
属性 | 类型 | 描述 |
---|---|---|
id | String | 角色(唯一标识) |
name | String | 角色名称 |
description | String | 描述备注 |
creatorId | String | 创建人ID |
4.3.3 配置
在applicationContext.xml配置文件中找到
<bean id="roleManager" class="com.neusoft.saca.dataviz.system.impl.RoleManagerImpl"></bean>
将com.neusoft.saca.dataviz.system.impl.RoleManagerImpl
替换为新的实现类名称。
第5章 权限集成
SaCa DataViz 提供了公共项目访问授权功能,在做业务系统集成时,授权往往都在业务系统中完成,通过权限集成可以实现在业务系统中控制公共项目的权限。
5.1 接口说明
- 接口名称:com.neusoft.saca.dataviz.common.security.access.DataVizOpenAccessController
- 所在包:dataviz-common.jar
9.1.1 hasPermission
//判断用户是否对指定资源有指定的操作权限。
public boolean hasPermission(String userId, String objectId, ResourceType resType, Permission perm);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
userId | String | 否 | 用户ID |
objectId | String | 否 | 资源ID |
resType | ResourceType | 否 | 资源类型,枚举类型,可选值为UNKNOWN, PROJECT, DATASET, CHART, CHARTBOOK |
perm | Permission | 否 | 资源权限,枚举类型,可选值为CREATE, MODIFY, DELETE, VIEW |
返回参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
result | boolean | 否 | 用户是否对指定资源有指定的操作权限 |
9.1.2 getPermissions
//获取用户对指定资源的所有权限。
public Set<Permission> getPermissions(String userId, String objectId, ResourceType resType);
传入参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
userId | String | 否 | 用户ID |
objectId | String | 否 | 资源ID |
resType | ResourceType | 否 | 资源类型,枚举类型,可选值为UNKNOWN, PROJECT, DATASET, CHART, CHARTBOOK |
perm | Permission | 否 | 资源权限,枚举类型,可选值为CREATE, MODIFY, DELETE, VIEW |
返回参数
属性 | 类型 | 是否可能为空 | 描述 |
---|---|---|---|
result | boolean | 否 | 用户是否对指定资源有指定的操作权限 |
9.2 修改配置
修改 WEB-INF\conf\spring\下的配置文件 applicationContext-security.xml
<beans:bean id="publicProjectAccess" class="com.neusoft.saca.dataviz.openproject.pub.access.PublicProjectAccess" autowire="byType"></beans:bean>
将class改为实际的实现类。
9.3 权限说明
各资源的权限之间是有依赖关系的,有的权限是由多个权限组成的
- DATASET(数据集)
- CREATE:数据集的创建权限
- MODIFY:数据集的编辑权限,依赖于数据集的查看权限
- DELETE:数据集的删除权限
- VIEW:数据集的查看权限
- CHART(图表)
- CREATE:图表的创建权限,依赖于数据集的创建权限或者数据集的查看权限
- MODIFY:图表的编辑权限,依赖于图表的查看权限
- DELETE:图表的删除权限
- VIEW:图表的查看权限,依赖于数据集的查看权限
- CHARTBOOK(图册)
- CREATE:图册的创建权限,依赖于图表的创建权限或者图表的查看权限
- MODIFY:图册的编辑权限,依赖于图册的查看权限
- DELETE:图册的删除权限
- VIEW:图册的查看权限,依赖于图表的查看权限