独立报表服务模拟单点登录

我们把报表服务做成单独应用,供其他应用调用。

主要解决不登录 就能在浏览器打开报表的问题,以提高报表安全性

原理:

Web应用提供的token验证,调用报表服务的时候,传递token值,每次打开birt报表,通过filter校验token是否合法。

解决办法:

所有报表展示都会通过frameset这个birt自带的servlet进行过滤,对frameset进行过滤即可

ps1:最早是想通过进入的页面report_test.jsp进行过滤,但这样,用户还是可以通过复制下一级别iframe的url(包括frameset?...)获取报表数据。

ps2:对应钻取的报表,birt设计文件,需要增加token参数,钻取的时候,也需要传递token参数,否则,钻取的报表也会报告权限不足。

(报表token参数设置) 

(钻取报表设置token参数页面)

代码说明:

TokenFilter:

package com.tbyf.system;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

import com.alibaba.fastjson.JSONObject;
import com.tbyf.dao.DaoTool1;
import com.tbyf.tools.HttpClientUtils;

/**
 * 校验token
 */
public class TokenFilter implements Filter {
	protected FilterConfig filterConfig;
	protected String checkToken = "0";  //默认不检查
	protected String checkTokenUrl="";
	private static final String  S_CHECK_TOKEN="1";  //检查token
	private static final String  S_OVER_TOKEN="0";
	private static final String  LEGAL_TOKEN="200";

    /**
     * Default constructor. 
     */
    public TokenFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		if(S_CHECK_TOKEN.equals(checkToken)){  //检查token
			//读取token
			String token=request.getParameter("token");
			if(token==null || token.equals("")) {
				response.setContentType("text / html; charset = utf-8"); 
				request.getRequestDispatcher("refuse.html").forward(request,response);
			}else {
				//获取url参数
				String url=checkTokenUrl;
				url=url+"?token="+token;
				String jsonStr="";
				try {
					//System.out.println("---------------url----:"+url);
					//通过httpclient,进行token验证
					jsonStr = HttpClientUtils.getInstance().httpGet(url);
					//System.out.println("---------------jsonStr----:"+jsonStr);
					//对结果集进行解析
					JSONObject o = JSONObject.parseObject(jsonStr);
					String code=o.getString("code");
					//System.out.println("---------------code----:"+LEGAL_TOKEN.equals(code));
					if(LEGAL_TOKEN.equals(code)){
						//System.out.println("---------------chain.doFilter(request, response)----");
						chain.doFilter(request, response);
						//return;
					}else {   //token验证没有通过
						response.setContentType("text / html; charset = utf-8"); 
						request.getRequestDispatcher("refuse.html").forward(request,response);
					}
				} catch (Exception e) {
					//System.out.println("---------------Exception----:");
					e.printStackTrace();
					response.setContentType("text / html; charset = utf-8"); 
					request.getRequestDispatcher("refuse.html").forward(request,response);
				}

			}
			
		}else {
			chain.doFilter(request, response);
		}
	}

	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		this.filterConfig = fConfig;
		this.checkToken = filterConfig.getInitParameter("CheckToken");
		System.out.println("检查token启动, checkToken:" + checkToken);
		this.checkTokenUrl = filterConfig.getInitParameter("checkTokenUrl");
		System.out.println("检查token启动, checkTokenUrl:" + checkTokenUrl);
	}
	
}

对应的web.xml相关内容:

<filter>

<description>

</description>

<display-name>TokenFilter</display-name>

<filter-name>TokenFilter</filter-name>

<filter-class>com.tbyf.system.TokenFilter</filter-class>

<init-param>

<param-name>CheckToken</param-name>

<!--1就检查token  0 不检查-->

<param-value>1</param-value>

</init-param>



<init-param>

<param-name>checkTokenUrl</param-name>
<!--验证地址-->

<param-value>http://10.16.53.40:88/nowDate</param-value>

</init-param>

</filter>

<filter-mapping>

<filter-name>TokenFilter</filter-name>

<!--<url-pattern>/report_test.jsp</url-pattern>-->

<url-pattern>/frameset</url-pattern>

<dispatcher>REQUEST</dispatcher>

</filter-mapping>

                                                            (web.xml内容) 

httpclent工具类:

	public String httpGet(String url, Map<String, String> headMap) {
		String responseContent = null;
		CloseableHttpClient httpclient = HttpClients.createDefault();
		try {
			HttpGet httpGet = new HttpGet(url);
			CloseableHttpResponse response1 = httpclient.execute(httpGet);
			setGetHead(httpGet, headMap);
			try {
				System.out.println(response1.getStatusLine());
				HttpEntity entity = response1.getEntity();
				responseContent = getRespString(entity);
				System.out.println("debug:" + responseContent);
				EntityUtils.consume(entity);
			} finally {
				response1.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				httpclient.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return responseContent;
	}

更新步骤:

报表服务增加过滤器,对token进行验证:

1、追加jar文件(jar文件夹下)     --httpclient相关jar

2、追加/更新过滤器类TokenFilter  ---过滤器类

3、追加tools下的  httpclient*等多个文件   --httpclient工具类

4、追加页面refuse.html  --权限不足的提示页面

5、修改web.xml文件(见上面的代码)

这个实现方式 还有个错误.......

SSO(Single sign-on)即单点登录技术。它是指在多个子系统的大型应用中,用户在子系统之间进行切换时,不需要每次都重新输入用户的身份信息,从而做到一处认证,整个应用系统都能有效识别。单点登录技术的系统集成功能为当前企事业单位尤其是大型多子系统企业系统集成提供了完美的解决方案。它使得这些原有系统能够合理的集成起来,对外提供统一的界面风格和唯一的登录入口。单点登录只是一种功能概念,并没有对具体的实现方式进行定义和限制。NC-Portal的单点登录方案,就是SSO技术的一种实现方式。 NC-Portal的SSO方案是基于凭证的思想设计。对于NC-Portal集成的每个第三方系统都有一个制作凭证的页面,该页面用于当前登录的portal用户输入对应的第三方系统的用户信息,在正常情况下,该制作凭证的页面最多出现一次。当用户输入的第三方系统登录信息进行验证后,会自动在portal系统的数据库中建立一对凭证槽和凭证信息,这对信息记录了portal用户在特定的portal布局和特定的portlet下,与该第三方系统的身份对应关系。当该用户之后登录portal并进入被集成第三方系统时,portal系统负责获取之前成功建立的对应第三方系统身份信息,并用该身份信息进行第三方系统的身份认证。这一切的操作对当前登录用户来说都是透明的,他们看到的是没有输入任何身份信息而以正确的身份进入了第三方系统。另外,在用户每次登录第三方系统时,都会根据第三方系统的要求进行身份认证,因此这个登录过程是安全的。 对于NC-Portal来说,对Web系统的集成提供了完善的支持和解决,对Web系统的集成,目前有大小之分。集成一个单独的系统如NC、IUFO、BO、OA系统采用单独的一个布局存放(当然,该布局也是由一个portlet组成),这些Web系统称为“大”系统。另外,还存在一些集成第三方系统的“小”portlet,如NC待办事务Portlet、NC报表Portlet、IUFO报表Portlet等,这些是以“小”Portlet的形式出现的。他们主要提供一些对集成系统的辅助功能,如对NC待办事务的提取、对IUFO报表信息的提取,这两种方式功能侧重点略有不同。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值