FineReport与企业集成实例(.NET)

编辑
文档创建者:天狮座 (78536 )     浏览次数:2473次     编辑次数:16次     最近更新:ukae 于 2018-08-23     

目录:

一、搭建环境部署报表编辑

首先,搭建好FineReport需要的环境,再部署好报表服务器,详细请点击Tomcat服务器部署

集成原理介绍:

原理:本次集成的SSO认证机制和大多数的统一认证一样,登录了SSO认证中心,那么所有系统就可以免登录。

方法:在url中的sticket中获取到username和password来检验是否有权限登录。

目的:要实现和SSO认证中心的集成,将企业SSO登录认证逻辑加在数据决策系统中,这样才能实现两个系统的认证机制的统一性。

这里用户直接在自己的系统中添加FR报表的链接,将FR报表集成到用户系统中就是将FR报表预览的直接全路径作为用户系统节点的链接地址,登录用户系统,点击FR报表链接,先登陆验证,登陆成功后,根据用户的角色信息,不同的用户有不同的权限,每个用户只能查看到有权限查看到的报表模板。


二、人员数据同步和权限集成编辑

将需要集成的人员数据同步到数据决策系统的用户管理中,详细点击用户同步数据集,并设置认证方式为Http认证,详细看第三章

模板权限控制设置为角色权限控制,再根据不同的角色分配不同的模板访问权限,详细点击角色权限控制

222


三、认证机制编辑

这里选择用Http认证的方式,填写的url地址为:http://localhost:8080/webapps/WebReport/renzheng.jsp

222

renzheng.jsp文件的代码为:

<% String username = request.getParameter("fr_username"); String password = request.getParameter("fr_password"); if (password.equals("123123123")) { response.getWriter().write(username); } else { response.getWriter().write("false"); } %>

代码含义是:发送的用户名和密码字段,如果密码为123123123,则可以通过进入数据决策系统,如果不通过则返回false。

注意:此处的通过认证逻辑需要根据自己公司的认证机制来处理,这里只做简单例子而已 

修改%FR_HOME%/WebReport/Web-INF文件夹下的web.xml,在<web-app></web-app>节点中最后插入:

<filter> <filter-name>jpFilter</filter-name> <filter-class>com.fr.io.JPFilter</filter-class> <init-param> <param-name>ssourl</param-name> <param-value>http://localhost:8080/WebReport/renzheng.jsp</param-value> </init-param> </filter> <filter-mapping> <filter-name>jpFilter</filter-name> <url-pattern>/ReportServer</url-pattern> </filter-mapping>

其中会引用到需要新写一个JPFilter这个文件用于过滤,将编译完后的JPFilter.class文件位置放在 %FR_HOME%/WebReport/Web-INF\classes\com\fr\io\JPFilter 文件夹内。

JPFilter代码如下:

package com.fr.io; import com.fr.fs.base.entity.User; import com.fr.fs.base.entity.UserInfo; import com.fr.fs.control.UserControl; import com.fr.fs.privilege.auth.FSAuthentication; import com.fr.fs.privilege.base.FServicePrivilegeLoader; import com.fr.fs.privilege.entity.DaoFSAuthentication; import com.fr.general.http.HttpClient; import com.fr.json.JSONException; import com.fr.json.JSONObject; import com.fr.privilege.session.PrivilegeInfoSessionMananger; import com.fr.web.utils.WebUtils; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.io.PrintStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; 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 javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class JPFilter implements Filter { private String ssourl; public void destroy() {} public void init(FilterConfig arg0) throws ServletException { this.ssourl = arg0.getInitParameter("ssourl"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { try { //接收请求 HttpServletRequest req = (HttpServletRequest)request; HttpServletResponse res = (HttpServletResponse)response; String reportlet = req.getParameter("reportlet"); if (reportlet == null) { reportlet = req.getParameter("formlet"); } if (reportlet == null) { reportlet = req.getParameter("reportlets"); } if (reportlet == null) { chain.doFilter(request, response); return; } //从请求参数中获取sticket值,再由sticket值解析取出用户名 HttpSession session = req.getSession(true); String sticket = WebUtils.getHTTPRequestParameter(req, "sticket"); Object name = session.getAttribute("fr_username"); if ((!"".equals(sticket)) && (sticket != null)) { String tiurl = "http://%SSO%/%renzheng%.aspx?sticket=" + sticket; String json = loadJSON(tiurl); //解析json对象 JSONObject jo = new JSONObject(json); String UserID = jo.getString("UserNumber"); System.out.println("UserID:" + UserID); String password = "123123123"; String result = "false"; if ((UserID != null) && (password != null)) { //拼接url String url = this.ssourl + "?fr_username=" + UserID + "&fr_password=" + password; HttpClient client = new HttpClient(url); int statusCode = client.getResponseCode(); if (statusCode != 200) { try { throw new Exception("Get PublicKey method failed, status is : " + statusCode); } catch (Exception e) { e.printStackTrace(); } } else { result = client.getResponseText(); } } if ((!"false".equals(result)) && (UserID != null)) { try { User U = UserControl.getInstance().getByUserName(UserID); if (U != null) { FSAuthentication authentication = new DaoFSAuthentication(new UserInfo(U.getId(), UserID, UserID)); long userid = authentication.getUserInfo().getId(); PrivilegeInfoSessionMananger.login(new FServicePrivilegeLoader(UserID, UserControl.getInstance().getAllSRoleNames(userid), UserControl.getInstance().getUserDP(userid)), session, res); session.setAttribute("fr_fs_auth_key", authentication); UserControl.getInstance().login(userid); } } catch (Exception e) { e.printStackTrace(); } } chain.doFilter(request, response); } else { //用户名匹配为空则重定向至SSO认证中心重新登录 if (("".equals(name)) || (name == null)) { String url = WebUtils.getOriginalURL(req); res.sendRedirect("http://%SSO%/登录.aspx?&callback=" + url); return; } chain.doFilter(request, response); } } catch (JSONException e1) { e1.printStackTrace(); } } //解析JSON对象方法 public static String loadJSON(String url) { StringBuilder json = new StringBuilder(); try { URL oracle = new URL(url); URLConnection yc = oracle.openConnection(); BufferedReader in = new BufferedReader(new InputStreamReader(yc.getInputStream())); String inputLine = null; while ((inputLine = in.readLine()) != null) { json.append(inputLine); } in.close(); } catch (MalformedURLException localMalformedURLException) {}catch (IOException localIOException) {} return json.toString(); } }

代码大义为:登录SSO认证中心成功后,直接进入数据决策系统,系统判断用户名密码与数据决策系统用户管理的用户密码一致则默认已经登录数据决策系统,可以直接访问报表。如果登录SSO失败,返回SSO登录页面让用户登录。


四、效果展示编辑

1、首先如果未登录SSO系统,但是通过微信或则其他客户端点击进入了报表链接,会直接跳到SSO登录页面

222

2、输入用户名密码登录成功后,并且有权限会直接认证跳到报表页面


222

如果用户名密码登陆失败,则还是会跳到登录页面继续登录,如果登录成功没有权限,则会显示


222


附件列表


主题: 部署集成
如果您认为本文档还有待完善,请编辑

文档内容仅供参考,如果你需要获取更多帮助,付费/准付费客户请咨询帆软技术支持
关于技术问题,您还可以前往帆软社区,点击顶部搜索框旁边的提问按钮
若您还有其他非技术类问题,可以联系帆软传说哥(qq:1745114201

此页面有帮助吗? [ 去社区提问 ]