【仅供内部供应商使用,不提供对外解答和培训】

一、特殊名词介绍

二、背景、场景介绍

SessionPrivilegeFilterProvider接口时早期帆软产品中开出的一个边界比较模糊的代码级接口。早期版本中主要用于修改系统服务的响应增强、sessionID防暴力破解、cookie加解密、报表请求预处理等等场景。

在10.0版本中sessionID本身已经具备较强的防暴力破解的能力,而响应增强,cookie加解密已经从改接口中剥离出来用其他接口实现。而仅剩的报表请求预处理接口实质上目前也可以通过其他接口实现预处理。所以改接口在10.0及以后的版本中实际上很少会使用到。主要是在9.0和更低的版本中使用,10.0中仅做部分兼容性保留(一些场景也不再兼容)

三、接口介绍

SessionPrivilegeFilterProvider.java
package com.fr.stable.fun;

import com.fr.stable.fun.mark.Mutable;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * 根据sessionid判断当前用户是否有权限访问该模板或者entry.
 * 默认权限检测是在创建session之前, 如果用某种手段得到了sessionid, 那么就可以访问当前sessionid内容.
 * 只检测cpt和表单, 如果需要检测BI, 图表等内容, 就再加provider
 *
 * Created by Administrator on 2016/6/24/0024.
 */
public interface SessionPrivilegeFilterProvider extends Mutable{

    String XML_TAG = "SessionPrivilegeFilterProvider";

    int CURRENT_LEVEL = 1;

    /**
     * 给res那边加上更严格的响应头
     * 华为那边AppScan扫描要求必须同域名frame, 同域名资源文件请求等等.
     *
     * res.setHeader("X-Content-Type-Options", "nosniff");
     * res.setHeader("X-XSS-Protection", "1");
     * res.setHeader("X-Frame-Options", "SAMEORIGIN");
     * res.setHeader("Content-Security-Policy", "img-src 'self' data;");
     *
     * @return
     */
    void addSecurityResponseHeader(HttpServletResponse res);

    /**
     * 从req中获取需要的参数, 并判断是否拥有当前sessionid的访问权限
     *
     * @param req http请求
     * @param res http响应
     */
    void filterSession(HttpServletRequest req, HttpServletResponse res);

    /**
     * 对sessionid进行MD5加密, 防止暴力破解轮询
     *
     * @param sessionID 原sessionid
     * @return 加密后的sessionid
     */
    String encodeSessionID(String sessionID);

    /**
     * 对cookie中的数据进行加密
     *
     * @param cookieStr cookie中的值
     * @return 加密后字符串
     */
    String encodeCookie(String cookieStr);

    /**
     * 对cookie中的值进行解密
     *
     * @param encodeStr 加密后字符串
     * @return 解密后字符串
     */
    String decodeCookie(String encodeStr);
}


四、支持版本

产品线

版本

支持情况

备注

FR8.0支持
FR9.0支持
FR10.0支持部分方法支持

五、插件注册

plugin.xml
<extra-core>
        <SessionPrivilegeFilterProvider class="your class name"/>
</extra-core>

六、原理说明

接口只能在设计器中被调用,在需要调用的地方通过Set<SessionPrivilegeFilterProvider> set = PluginModule.getAgent(PluginModule.ExtraCore).getArray(SessionPrivilegeFilterProvider.XML_TAG);获取到插件中所有申明的Session安全增强和权限处理接口。

默认的产品中主要在:sessionInfo被创建添加以及op请求分发处理时,以及系统请求分发处理时(9.0及更低版本中)生效。

七、特殊限制说明

10.0中目前只有以下两个方法还有用

void filterSession(HttpServletRequest req, HttpServletResponse res);

String encodeSessionID(String sessionID);

剩下的3个接口方法均只能在低版本中使用。

其中filterSession目前10.0中只对op类报表请求具备拦截能力,同时该方法除非抛出异常或者通过修改请求的内容,否则时无法终止或者干预请求的后续执行的。在一次报表的预览中该接口会被多次执行到。

而encodeSessionID接口方法是当报表session被创建添加时,立刻执行的。但是要注意,该接口生效时,报表session还未被跟sessionID绑定!所以无法在这个接口通过sessionID获取到报表session

八、常用链接

demo地址:demo-session-privilege-filter-provider

SessionManageProcessor

ReportSessionHelpProvider

插件中四种实现filter功能的接口对比


九、开源案例

免责声明:所有文档中的开源示例,均为开发者自行开发并提供。仅用于参考和学习使用,开发者和官方均无义务对开源案例所涉及的所有成果进行教学和指导。若作为商用一切后果责任由使用者自行承担。


  • No labels