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

编辑
  • 文档创建者:天狮座
  • 浏览次数:4218次
  • 编辑次数:17次
  • 最近更新:Kevin-s 于 2019-06-09
  • 一、搭建环境部署报表

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

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

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

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

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


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

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

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


    三、认证机制

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



    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 登录页面


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


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



    附件列表


    主题: 部署集成
    标签: 暂无标签 编辑/添加标签
    如果您认为本文档还有待完善,请编辑

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

    此页面有帮助吗?只是浏览 [ 去社区提问 ]