第1章 背景
本手册主要介绍如何将SaCa DataViz中集成在企业号下,以让企业号中的用户在企业号中访问DataViz下已定义好的公共项目下的图表、图册。
第2章 方法
2.0 总体过程
配置DataViz 后台,使其可以在使用微信中企业号访问时,自动将企业号用户登录到DataViz。
在DataViz中设置让企业号用户能够访问到指定的图表或图册。设置的方式有两种:分享或看板。
使用微信企业号OAuth2.0获取Code回调地址链接指定ID的图册或图表,添加到企业号用户上。
2.1 前提条件及准备
SaCa DataViz 必须已经正确部署,并可以通过公网地址通过页面登录访问。
SaCa DataViz 已经配置为企业号中的应用,并拥有 corpId 及 secret。
2.2 配置
为了配合在企业号中使用,需要修改DataViz后台 /WEB-INF/conf/spring/applicationContext-security.xml 文件的配置。
找到
标签,修改其中内容,添加或启用为以下内容: <custom-filter before="FORM_LOGIN_FILTER" ref="wxqyLoginFilter"></custom-filter>
在该文件中添加或启用以下内容
<beans:bean id="wxqyLoginFilter" class="com.neusoft.saca.dataviz.authentication.springsecurity.wxqy.WxqyAuthentationProcessingFilter"> <beans:property name="authenticationManager" ref="authenticationManager" /> <beans:property name="authenticationSuccessHandler" ref="authenticationResultHandler" /> <beans:property name="authenticationFailureHandler" ref="authenticationResultHandler" /> </beans:bean>
找到
,其中添加或启用以下内容 <authentication-provider ref="wxqyAuthenticationProvider" />
文件中添加或启用以下内容
<beans:bean id="wxqyAuthenticationProvider" class="com.neusoft.saca.dataviz.authentication.springsecurity.wxqy.WxqyAuthenticationProvider">
<beans:property name="corpInfoAccess" >
<beans:bean id="corpInfo" class="com.neusoft.saca.dataviz.authentication.springsecurity.wxqy.CorpInfoAccess">
<beans:constructor-arg name="corpId" value="corpId"/>
<beans:constructor-arg name="secret" value="secret"/>
</beans:bean>
</beans:property>
<beans:property name="userDetailsService" >
<beans:bean id="wxqyUserDetailsService" class="com.neusoft.saca.dataviz.authentication.springsecurity.UserIdUserDetailsService">
</beans:bean>
</beans:property>
</beans:bean>
其中,需要把 corpId 和 secret 分别替换为实际企业号中分配的 corpId 和 secret;wxqyUserDetailsService bean实现的Spring Security中的UserDetailsService
接口,用于接收从微信企业号中得到的UserId,并返回一个对应DataViz中记录的用户ID的对象。(该用户ID可以后续在DataViz系统变量中取到)该类可以有不同的配置方式:
a. 使用上文中提到的UserIdUserDetailsService
类,该类实现的验证用户是否在DataViz用户表中存在,并使用企业号的UserId直接映射到了DataViz中的用户Id。使用该类意味着企业号用户必须已经在DataViz用户表中存在,且ID对应相同。如果使用该配置,可能需要预先使用数据库工具,将用户数据导入到DataViz支撑库 dv_useraccount 表中,该表结构简单说明如下:
user_id: 用户ID,varchar,非空,主键
user_name: 用户名,用于显示,varchar
account_state: 用户状态,number 非空,默认1即可
account_role: 使用者角色。Number 非空,默认0即可
create_date: 创建时间,datetime 非空。
create_by: 创建人,varchar
last_login: 最近登录,datetime
user_data_analysis: number,非空,默认0即可。
b. 自定义的 UserDetailsService
实现类。使用自定的实现类,用户信息可以不存在于DataViz库中,这样可以保证登录时的用户与企业号中的用户账号保持实时同步。一个最简单的 UserDetailsService
实现类如下(除Spring Security依赖外,还需引入dataviz-common.jar做依赖):
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import com.neusoft.saca.dataviz.common.security.DefaultUser;
public class UserIdUserDetailsService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
DefaultUser user = new DefaultUser(username, ""); // 普通用户权限
return user;
}
}
该实现类同样直接使用企业号返回的UserId作为DataViz用户ID。
注意: 1. 无论使用哪种方式,除非用户之前已经在DataViz中创建,否则由于缺少用户登录信息,这些用户是无法直接在页面上登录的。2. 如果使用第二种方法,并只使用系统变量控制用户权限,此处可以直接使用上文中的代码,在系统变量开发中,再将该ID转换为业务所需的用户身份,具体开发和使用可以参考《系统变量集成》。3. 如果使用第二种方法,并需要在DataViz中逐用户使用看板设置可见(可使用)内容(参见使用部分说明),那么需要参照《CAS单点登录集成》中第2.4节-登录用户集成中的内容进行几个接口的开发。(通常用户访问权限是在企业号中设置的,因此通常并不需要)
2.3 使用
2.3.1 DataViz端
配置修改完成后,需要重启DataViz后台服务,原页面可登录用户仍可正常登录。可以有提供给用户查看的方法:
使用分享
建议使用的方法。直接分享图表图册,在不暴露分享链接的情况下,只有在企业号配置了的用户才能够查看。
使用用户看板
如果需要很高的安全性或细粒度的访问权限划分,可以使用用户看板方式。首先,给用户查看的图表图册应在公共项目中,如果存在于个人项目中可以将其转入到公共项目下。然后使用管理员账号登录,在系统设置-权限设置中,使用看板设置,将图表图册分配到指定用户。(注意如果用户不存在于DataViz中需要开发,具体参见配置部分)
2.3.2 企业号端
企业号端需要为图表图册添加链接,需要使用企业号提供的OAuth2.0验证Code回调方式,其 redirect_uri
格式为:
http://<dataviz服务地址>:<dataviz服务端口>/<dataviz应用名>/src/wxqyPlayCallback.html?id=<图表图册ID>&type=<类型>
其中,类型值 1 为图册,2为图表。 图表、图册ID的获取方法:Web登录后直接编辑图表/图册,地址栏中最后一个/ 后的UUID即为其ID。