问题一:由于一个action未进行验权而导致的问题
背景:
1. 在进行一个业务逻辑操作的过程中,对于一个用户如果没有某个操作的权限,我们通常会将其引导到权限申请页面或者用户信息完善页面;
2. 用户访问一次页面发送一次请求,线程变量就会记录该次用户的登录信息;
3. 而当用户访问一些页面的时候是可以跳过这些用户的登录信息的,比如用户信息完善页面;
问题描述:
1. 一个用户访问到其没有权限的一个操作时,系统引导其到一个用户信息页面同时将其访问的页面以redirect参数的形式带在链接上,而用过webx的同学应该知道,对于action的调用,一般是直接将action参数和event参数直接挂在连接上,当然这也是这个问题出现的主要原因;
2. 用户到用户信息页面后,由于这个页面不需要验证用户的登录信息,加上连接上的action和event参数,就直接跳过了请求阀门中进行验权的操作,而直接进入action的主题函数中,而action本身是没有进行权限验证的,导致业务逻辑被执行,问题也就产生了;
3. 由于没有进行用户登录信息验证,使得线程变量池记录的是上一次用户登录的信息,导致日志记录操作人也出错。
解决方案:
1. 请求结束后及时清掉用户信息,每一次请求都会重新去session中去取用户信息;
2. 针对权限点验证,除了在请求阀门中验证以外,对于有暴露不需要验权页面的系统,需要在重要的action中也进行验权处理;
3. 针对action提交操作,除了添加验权外,也可以添加token来防止链接被人误操作;
问题二:关于webx中的vm中引入control的两种方式:$control.setTemplate()与#parse()的区别
webx的vm模板分为screen 展现页面的主题部分,layout用于系统的布局和结构,control用于承载系统中共用的部分;
webx中既可以通过#parse()引用control,也可以通过$control.setTemplate()引用;
#parse()是velocity层面的引用,father.vm 通过#parse(son.vm)引用了son.vm模板之后,可以理解为son.vm是father.vm的一部分,son.vm如果有对应后端处理逻辑,是不会被执行的,但是son.vm中可以共用father.vm的参数变量;
$control.setTemplate()是webx层面提供的一种control引用方式,father.vm通过$control.setTemplate(son.vm)引用了son.vm之后,father.vm会进行顺序解析,在解析到$control.setTemplate()的时候,会进行到son.vm模板中去进行解析,所以会执行son.vm所对应的后端处理逻辑;同时,son.vm中不能使用father.vm中的参数,如果需要将father.vm中的变量共享到son.vm,可以通过setParameter()传入son.vm中。
简而言之:
1. #parse()是velocity层面,$control.setTemplate()是webx层面
2. #parse()不会执行引用vm的后端逻辑,$control.setTemplate()会执行
3. #parse()引用vm与被引用vm共享参数变量集,$control.setTemplate()如需共享,需要传入