TSS增加不同的使用场景,可配置不同的安全级别,共7级,通常建议配置在6级以上。安全级别 security.level 配置在application.properties里,打包时设定安全级别值。除此之外,还有白名单、密码定期修改、登录出错达到10次锁定密码等
1、安全级别 >=4 fuckXSS 开启防XSS注入攻击的过滤;(Admin除外,以便在线维护record、门户组件里脚本) 2、安全级别 >= 4,访问报表服务(json或jsonp或下载导出)需要对报表有浏览权限。 安全级别 < 4则可以匿名访问。 安全级别高的情形下,如需让某个报表服务可被匿名访问,则将报表服务的浏览权限授权给匿名角色。 安全级别 = 6,数据录入的所有接口(包括附件操作)开启行级数据权限检查; 安全级别 = 7,所有远程接口访问都要进行签名及验签,适合外部系统访问场景( < 7 支持直接秘钥uToken访问,适合内部系统间访问场景) 3、/auth/... 的服务如果需要被匿名访问,tssJS.ajax request里设置header.anonymous = true 4、API白名单:设置含特定关键字的服务是否可以匿名访问 5、IP白名单:跨域访问时,有防盗链机制,例外需加到IP白名单 6、登录验证超过10次出错,锁定账号10分钟 密码强制定期修改 & 密码强度安全检查,如果密码不安全(强度低或已过期等),则要求修改为安全密码后方可继续访问 注:强制用户修改密码间隔天数。默认180天,通过系统参数:passwd.cyclelife 设置
数据源异常,致使落到异常数据源的查询缓慢排队,进而超过QueryCahce的等待阈值MAX_QUERY_REQUEST,致使其它数据源的查询异常,解决办法如下:
1、在【性能监控】里找出正在执行的报表,进行针对性处理 2、在【数据源】里调整连接池的大小,控制其最大并发查询量 3、在【缓存管理】里把异常的数据源连接池状态设为“停用” 注:在【数据源】里调整保存某个数据源后,如果它在缓存管理里是停用的,将会自动启用
停用报表,并在其查询条件里加上 and 0=1, 使其立即失效。
数据类连接池、apache连接数、tomcat配置、机器负载情况
1、应用服务器分布式部署,无限复制; 2、查导分离:通常导出比较费时和消耗内存,可以把导出请求单独发送到一台独立的机器; 3、数据缓存:默认对查询数据结果缓存3分钟,能消除10%到50%不等相同(同一接口&相同参数)请求; 4、QueryCache:对查询过程(请求正处于执行状态)进行缓存,对后来的同一报表&相同查询条件 的查询请求,将不再发起DB查询,而是进入等待状态。等第一次的查询执行完成,后续的查询直接取缓存里的数据。 防止用户重复点击查询(以及频繁且耗时的查询),造成性能瓶颈。 5、控制等待状态的线程数:QueryCache的等待队列和HTTPProxy的转发请求队列,都会占用线程, 如果执行缓慢,会知道线程耗尽,系统奔溃。具体参考 QueryCacheInterceptor 和 Filter5HTTPProxy
2016-08-26 10:52:43 雅典娜库DB链接释放非常慢且使用中连接数逐渐上升,查看10分钟Cache(命中率高的离谱),发现部分QC_Cache项命中次数很高, 据此猜测:报表SQL执行慢 且 访问频繁 ==> QC_Cache池线程无法释放 ==> 线程耗尽、系统崩溃 解决办法:QC_cache的等待线程数,超过阈值则返回提示。
把所有【$企业域】及所有子组编辑权限开给部门主管,部门主管可以管理自己所在组及子组的人员 1、部门主管可以创建部门人员,编辑、停用、启用人员 2、在子组间移动人员 3、如需管理人员的角色,开发者需要先把相应角色的管理权限开给部门主管
TSS允许不同的实例自定义自己的登录页,也支持为每个不用的访问域名配置不同的登陆页,从而实现不同的企业域有自己的登陆页
1、白名单加: /customize_login,login_e8.html 2、系统参数加:自定义登陆页 = customize_login {"e8.boudata.com": "login_e8.html", "cx.boudata.com": "login_cx.html"}
注:自定义登录页后,login.html将会自动跳转过去,需要注册企业域的话需要加上参数reg=1,eg:http://localhost:9000/tss/login.html?reg=1
1、record的表字段和report的查询字段code一律用小写 2、SQL如果分成多行书写,当想要注释掉中间某一行时候,不能用"--"来注释,这样发到后台执行时, 会把改行后面的记录全部注释掉。可以用 /* ... */来注释,或直接删除改行 3、配置的参数个数需和SQL中接收的参数个数一致,类型也要一致
var web_server_url = ""; if( location.protocol === 'file:' ) { // 判断是否在本地打开HTML页面 web_server_url = "http://10.6.122.68:8080"; }
1、默认情况下,执行相同【查询条件 + 用户所在域】的查询结果会被缓存3分钟。 2、按用户缓存(查询条件一样,用户也要一样,用于sql里含数据行权限过滤的数据查询服务): /tss/data/json/123?uCache=true 或 {'label':'按用户缓存','type':'hidden','name':'uCache','defaultValue':'true'} 3、始终不缓存 /tss/data/json/123?noCache=true 或 {'label':'是否缓存','type':'hidden','name':'noCache','defaultValue':'true'} 注:按用户缓存适用用于查询脚本里加了用户信息(session里的账号、组织、角色等信息,比如${userCode}),这类情形必须使用uCache或noCache
在param里配置一个参数【report_export_url】,值为tomcat地址,比如:【http://10.12.101.9:8080】,则所有导出数据请求都被引导至这个服务地址。前提是:导出用服务器安全级别 <=2, 或通过需要白名单和uToken来配合完成。
在report_portlet.html,如果所有必填参数都已有值,则自己打开报表,无需弹出查询条件框;在reporter.html,一律先弹查询条件框。
1、tssJS.JSONP.getJSON( "http://10.9.45.68:8084/tss/data/jsonp/725", {"param1": 60061, "param3": "2016-05-25", "param4": "2016-05-26"}, function (data) { alert(data); } ); 2、使用普通ajax,首先client要加入server的ip白名单中. 另:经测试jQuery.ajax请求可以跨域调用成功,tssJS.ajax不行. jQuery.ajax({ url: "http://172.18.24.145:9000/tss/data/json/388", type: "POST", crossDomain: true, dataType: "json", success: function (data) { alert(data); } }); 注:jsonp的地址是/tss/data/jsonp, 比ajax调用/tss/data/json 多一个【 p 】
params.pagesize = 100*10000; // 100万 tssJS.getJSON( '/tss/data/json/' + reportId, params, function(data) { callback(data); } );
1、在appServer.xml里配置各个实例彼此的地址信息,如 < server code="BI" name="BI" ...... baseURL="http://10.10.12.67:8082/tss"/> < server code="BI2" name="BI-JOB" ...... baseURL="http://10.10.12.66/tss"/> 2、$.getJSON("/tss/data/json/xxx?appCode=BI", {...}, function(result) { ... } ); 注:如果目标应用的安全等级 >=4,则需携带令牌uToken或签名uSign
检查3分钟cache是否有异常,cleaner没有定时自动clean。是的话【清空并初始化】3分钟cache,或者直接【重启应用】。
1、录入表【tx_order】的浏览权限授予匿名角色 2、/xdata/json/tx_order 加入地址白名单, 相应html页面地址也加入地址白名单 3、/xdata/json/tx_order?anonymous=true 注:开放匿名访问了则无法在限制数据的域
找到下面三个XML文件,把里面: base-package="com.boubei" 修改成 : base-package="com.boubei,新建的package" 1、src/main/resources/META-INF/spring-framework.xml, 2、src/main/resources/META-INF/spring-mvc.xml 3、src/test/resources/META-INF/spring-test.xml。
1、给角色授权,是把资源列出来,按需授权给当前选中的角色;在角色授权界面里操作; 2、授予角色,是把角色列出来,按需把当前选中资源的权限授给某些角色;在各个资源管理界面里操作。
"私人资源":是属于某一个用户所有的资源,只有用户本人才能操作,其他用户不能操作。 例如用户的个人信息、订单、收货地址等等。 "角色资源":与私人资源不同,角色资源范畴更大,一个角色可以对应多个人,也就是一群人。 如果给某角色分配了权限,那么只有身为该角色的用户才能拥有这些权限。 例如系统资源只能够管理员操作,一般用户不能操作。 "公共资源":所有人无论角色都能够访问并操作的资源。
"资源权限",就是资源与操作的一套组合,例如"增加用户"是一种权限,"删除用户"是一种权限。 角色与用户的关系:一个角色对应一群用户,一个用户也可以扮演多个角色,所以它们是多对多的关系。 角色与权限的关系:一个角色拥有一堆权限,一个权限也能属于多个角色,所以它们多对多的关系。 权限与用户的关系:由于一个用户可以扮演多个角色,一个角色拥有多个权限,所以用户与权限是间接的多对多关系。 需要注意两种特别情况: 1、私人资源与用户的关系,一种私人资源的权限只能属于一个用户,所以这种情况下,用户和权限是一(用户)对多(权限)的关系。 2、超级管理员的角色,这个角色是神一般的存在,能无视一切阻碍,对所有资源拥有绝对权限,甭管你是私人资源还是角色资源。
名称 | 类型 | 值示例 | 描述 |
---|---|---|---|
userCode | String | BD0000 | 用户账号,SQL脚本引用示例: applier = '${userCode}' |
userName | String | 金石 | 用户名称 |
userRoles | List | [12,19] | 用户拥有的角色ID列表; userRoleNames同 |
_userRoles | String | 12,19 | 逗号分隔的字符串; _userRoleNames同 |
{角色名称} | String | 财务主管 | 比如判断是否拥有角色“财务主管”,写法为:<#if 财务主管??>...<#if> |
role_{角色ID} | Long | role_12 | 比如判断是否拥有角色“财务主管”ID,写法为:<#if role_12??>...<#if> |
userGroup | String | 浙江分公司 | 用户所在组 = GROUP_LAST_NAME |
userGroupId | Long | 102 | 用户所在组ID = GROUP_LAST_ID |
GROUP_LEVEL | int | 3 | 用户所属组层级 |
GROUP_{X}_ID | Long | GROUP_2_ID = 102 | X ∈ [1, GROUP_ GROUP_LEVEL],第X级组ID |
GROUP_{X}_NAME | String | GROUP_2_NAME = 财务部 | X ∈ [1, GROUP_ GROUP_LEVEL],第X级组名 |
DOMAIN | String | 卜数科技 | 用户所属域 |
USERS_OF_DOAMIN | String | 'BD0000','BD0001' | 逗号分隔,用户所属域下的用户账号集 |
USERIDS_OF_DOAMIN | String | 12,13 | 逗号分隔,用户所属域下的用户ID集 |
USERS_OF_GROUP | String | 'BD0000','BD0001' | 逗号分隔,用户所属组下的用户账号集;查询数据表时可直接加 ${filterByGroup},对数据进行按组过滤 |
USERIDS_OF_GROUP | String | 12,13 | 逗号分隔,用户所属组下的用户ID集 |
USERS_OF_GROUP_DEEP | String | 'BD0000','BD0001' | 逗号分隔,用户所处组(含子组)下的用户账号集;查询数据表时可直接加 ${filterByGroupDeep},对数据进行按组(含子组)过滤 |
USERIDS_OF_GROUP_DEEP | String | 12,13 | 逗号分隔,用户所处组(含子组)下的用户ID集 |
1、添加 servicewechat.com 到TSS的IP白名单【系统参数】,否则访问TSS服务时会报404.html(refer= https://servicewechat.com/.....) 2、添加 appId 和 appSecret 到系统参数。