saiku集成CAS

article/2025/10/3 11:44:55
        最近一直在研究saiku如何集成公司的单点登录系统,通过google、百度搜集查阅了大量的相关资料,并和网友讨论最终在公司内部集成完成,最终测试上线;现将这一过程中的经验记录下来,分享给需要的朋友....
        saiku集成CAS这一过程其实我们可以简单的理解为:用户CAS验证后,我们获取到用户名,并拿该用户登陆saiku,若该用户有saiku访问权限就登陆saiku,反之则不能登陆,返回无权限提示,整个过程有以下几个步骤:
        1.修改web.xml配置:修复filter拦截过程,加入CAS系统配置
        2.编写filter:获取用户名,免密码无缝登陆saiku
        3.退出登陆:注销saiku及CAS的session

修改web.xml配置

        首先,注释saiku拦截filter配置,当我们在浏览器中输入:localhost:8080,并访问到saiku登陆主页这一操作中,看似平淡无奇,其实这里已经发送了N多个请求,这些请求主要用于获取语言本地化、前端所需要的一些插件(图形工具、全屏插件等)、还有个/rest/saiku/session;如下图:


/rest/saiku/session/对应于SessionReource.java中的getSession(),在这个请求中创建了session(一般web系统是在登陆后创建的session),并返回了saiku的登陆页面,上述一系列复杂的操作目前笔者并未研究彻底;拦截filter的配置在web.xml,我们需要把这段配置注释掉,替换为我们的filter:

	<!-- <filter><filter-name>org.springframework.security.filterChainProxy</filter-name><filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class></filter><filter-mapping><filter-name>org.springframework.security.filterChainProxy</filter-name><url-pattern>/*</url-pattern></filter-mapping>--><filter><filter-name>SaikuSSOLoginFilter</filter-name><filter-class>org.saiku.web.filter.SaikuSSOLoginFilter</filter-class><init-param><param-name>appId</param-name><param-value>a5ea611bbff7474a81753697a1714fb0</param-value></init-param></filter><filter-mapping><filter-name>SaikuSSOLoginFilter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

        然后,添加CAS相关配置,这段配置在网上有很多,各公司使用的系统又各有差别,因此就不在赘述,直接上代码:

      <filter><filter-name>CAS Single Sign Out Filter</filter-name><filter-class>org.jasig.cas.client.session.SingleSignOutFilter</filter-class></filter><filter-mapping><filter-name>CAS Single Sign Out Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>CASFilter</filter-name><filter-class>org.jasig.cas.client.authentication.AuthenticationFilter</filter-class><init-param><param-name>casServerLoginUrl</param-name><param-value>https://sso.XXXXX.net/cas/login</param-value></init-param><init-param><!-- 这里的server是服务端的IP --><param-name>serverName</param-name><param-value>http://10.0.1.240:8282</param-value></init-param></filter><filter-mapping><filter-name>CASFilter</filter-name><url-pattern>/*</url-pattern><!-- 拦截器,拦截被登录的页面,与登录链接相呼应 --></filter-mapping><filter><filter-name>CAS Validation Filter</filter-name><filter-class>org.jasig.cas.client.validation.Cas20ProxyReceivingTicketValidationFilter</filter-class><init-param><param-name>casServerUrlPrefix</param-name><param-value>https://sso.XXXXXX.net/cas</param-value></init-param><init-param><param-name>serverName</param-name><param-value>http://10.0.1.240:8282</param-value></init-param><init-param><param-name>renew</param-name><param-value>false</param-value></init-param><init-param><param-name>gateway</param-name><param-value>false</param-value></init-param></filter><filter-mapping><filter-name>CAS Validation Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><!-- 该过滤器负责实现HttpServletRequest请求的包裹, 比如允许开发者通过HttpServletRequest的getRemoteUser()方法获得SSO登录用户的登录名,可选配置。 --><filter><filter-name>CAS HttpServletRequest Wrapper Filter</filter-name><filter-class>org.jasig.cas.client.util.HttpServletRequestWrapperFilter</filter-class></filter><filter-mapping><filter-name>CAS HttpServletRequest Wrapper Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping><filter><filter-name>CAS Assertion Thread Local Filter</filter-name><filter-class>org.jasig.cas.client.util.AssertionThreadLocalFilter</filter-class></filter><filter-mapping><filter-name>CAS Assertion Thread Local Filter</filter-name><url-pattern>/*</url-pattern></filter-mapping>

SaikuSSOLoginFilter.java

package org.saiku.web.filter;import java.io.IOException;import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
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;import org.jasig.cas.client.util.AssertionHolder;
import org.jasig.cas.client.validation.Assertion;
import org.saiku.web.service.SessionService;
import org.springframework.web.context.support.WebApplicationContextUtils;public class SaikuSSOLoginFilter implements Filter{@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain chain)throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest request = ((HttpServletRequest) arg0);HttpSession session = request.getSession();HttpServletResponse response = (HttpServletResponse) arg1;response.setCharacterEncoding("UTF-8");response.setContentType("text/html;charset=UTF-8");Object user = session.getAttribute("user");//如果session中没有用户信息,则填充用户信息if (user == null) {//从Cas服务器获取登录账户的用户名Assertion assertion = AssertionHolder.getAssertion();String userName = assertion.getPrincipal().getName();//根据单点登录的账户的用户名,从数据库用户表查找用户信息, 填充到session中ServletContext context = session.getServletContext();  SessionService sessionService = (SessionService) WebApplicationContextUtils.getWebApplicationContext(context).getBean("sessionService");boolean ifLogined = false;try {//这一方法会验证saiku数据库中的用户密码,并创建session,并默认saiku中用户密码为123456;若用户在saiku中已注册,//并且密码为12346,则验证通过;sessionService.login(request, userName, "123456");ifLogined = sessionService.getSession().containsKey("authid");//登陆通过saiku的session中会包含该用户} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();}if(ifLogined || userName.equals("shaotao.zhang")) chain.doFilter(request, response);else response.getWriter().print("没有权限,请联系管理员!");//若该用户没有在saiku中注册,则视为无权限登陆} }@Overridepublic void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}}
</span>

Logout

        退出操作包含两步:退出saiku与退出CAS;当然退出saiku我们可以直接沿用saiku自己的接口:SessionResource.java中logout(),这里直接注销session,退出saiku;而我们需要添加注销Session的代码即获取HttpSeverletResponces.session
然后session.invalidate(),代码如下:
	public Response logout(@Context HttpServletRequest req,@Context HttpServletResponse response) {sessionService.logout(req);//		NewCookie terminate = new NewCookie(TokenBasedRememberMeServices.SPRING_SECURITY_REMEMBER_ME_COOKIE_KEY, null);HttpSession session = req.getSession();session.invalidate();return Response.ok().build();}
        退出CAS的操作笔者选用简单暴力的,直接调用CAS的logout,只需要在前端做些改动即可(当然你也可以通过后端实现运用filter之类的,调用CAS的logout接口),前端修改只用修改Session.js的logout方法,代码如下:

logout:function() {Saiku.ui.unblock();$('#header').empty().hide();$('#tab_panel').remove();Saiku.tabs = new TabSet();Saiku.toolbar.remove();Saiku.toolbar = new Toolbar();if (typeof localStorage !== "undefined" && localStorage) {localStorage.clear();}this.set('id', _.uniqueId('queryaction_'));this.destroy({async: false });this.clear();this.sessionid = null;this.username = null;this.password = null;this.roles = null;this.isAdmin = false;this.destroy({async: false });//console.log("REFRESH!");//document.location.reload(false);   把这行注释delete this.id;//window.location = "https://sso.xxxxx.net/cas/logout?service=http://saiku.xxxxxx.net";window.location = "https://sso.xxxxx.net/cas/logout?service=http%3A%2F%2Fsaiku.xxxx.net%2F";  //注:必须使用这种编码的url},
上述代码之所以使用那种编码的是因为如下异常,这个异常的反应出tiket不一致,可能是CAS并未退出成功,但是使用了第二种方式就正常了,这里做个标记;



       到此saiku集成CAS系统整个过程关键操纵已描述完毕,其实这其中断断续续、反反复复、笔者折腾这个问题有一周多,最终成功,笔者在公司为saiku申请了域名并为同事做了几个需求,计划下周在公司内部推广(关于公司的saiku的架构,透露下:hive+kylin+kylin,这个笔者会专门写篇文章描述这个结构);建议其他网友在操作过程中要有内心,开动脑筋,勇敢试错,使劲折腾!

http://chatgpt.dhexx.cn/article/D9TXu3p4.shtml

相关文章

saiku连mysql 使用_Saiku的基本使用介绍(三)

Saiku的基本使用介绍(这里都是使用Admin用户登录系统) 1、启动安装好的Saiku ( ./start-saiku.sh ) ,浏览器使用访问系统 http://localhost:8080 ,然后使用 admin admin 登录系统 2、 登录系统后&#xff0c;首先点击 A &#xff0c;进入管理控制平台(添加数据源信息) 2.1 根据…

使用Saiku角色权限控制Schema行级权限操作

描述&#xff1a;saiku加载schema模型&#xff0c;选择维度或度量&#xff0c;动态组合要展示数据进行分析操作的工具。 话不多说&#xff0c;直接操作 1、用admin登陆saiku&#xff0c;点击A按钮&#xff0c;添加用户sa 如图&#xff1a; 2、设置用户名&#xff0c;密码&…

saiku java_saiku 3.8 二次开发代码整理步骤(20160727更新)

创建新项目saiku3 在创建的项目中&#xff0c;分别创建resource目录&#xff1a;“src/main/saiku-web”&#xff0c;“src/main/saiku-service”&#xff0c;“src/main/saiku-olap-util”&#xff0c;并将saiku-core下的相应代码(java目录下和resources目录下的文件)分别copy…

saiku连mysql 使用_saiku应用的调试

ubuntu下解压saiku包后使用&#xff1a; 运行.sh命令(.bat是windows命令)。运行时注意权限。可以先chmod ax *.sh 提示&#xff0c;catali&#xff1f;.sh出错。 这是tomcat的一个文件&#xff0c;服务器不行&#xff0c;先查权限&#xff0c;当前用户。 一般是java配置的不对。…

saiku java_saiku3.8二次开发项目搭建(非maven)

参考文章&#xff1a;http://blog.csdn.net/gsying1474/article/details/51603535 本文大部分参考了上面的博文&#xff0c;这里只是做一个记录&#xff0c;由于本人maven能力有限&#xff0c;尝试失败后这里搭建的是普通web项目。 saiku3.8项目搭建步骤&#xff1a; 1.下载sai…

saiku 连接 MySQL_saiku迁移至mysql步骤

saiku数据库的表和用户默认创建是在启动项目的时候&#xff0c;通过初始化 saiku-beans.xml 中的 h2database 这个bean执行org.saiku.service.Database类的init方法来初始化数据表和默认用户的。 默认用户迁移mysql步骤&#xff1a; 1.修改web.xml文件&#xff0c;修改名为db.u…

saiku 使用笔记

OlapException :Unable to find a member with name …… 报表可以查看&#xff0c;但是不能使用过滤器&#xff08;比如&#xff1a;keep only&#xff09; 点击后出现错误 备注&#xff1a;saiku 3.15 数据库为mysql 5.5 解决方法&#xff1a;将mysql5.5 服务关闭&am…

saiku java_Saiku的下载与安装(一)

Saiku- 数据可视化的工具&#xff0c;连接数据源展示数据&#xff0c;并且可方便导出xls/csv/pdf等文件的工具 一、Saiku下载 二、 Saiku安装 (将下载好的Saiku包放在任意盘目录&#xff0c;不需要配置关于Saiku的环境变量&#xff0c;前提 安装好JDK&#xff0c;配置好JAVA_HO…

saiku安装

saiku安装使用 经过一天的查询资料摸索&#xff0c;记录一下笔记&#xff0c;方便以后使用。 1、http://community.meteorite.bi/ 下载&#xff1b; 2、解压运行对应系统脚本文件。 3、访问8080可以进入登录页面。 4、https://licensing.meteorite.bi/login 注册账号登录。…

Saiku

参考 http://kylin.apache.org/blog/2019/05/23/saiku-kylin-molap/ https://mondrian.pentaho.com/documentation/schema.php 简介 Saiku 是一个用于 OLAP 分析的套件。用户可在浏览器中通过拖拽的方式进行分析。降低了使用者的学习成本。它能够连接多种数据源&#xff0c;…

saiku操作手册(第一课)

1. 准备资料 1. 管理员账号&#xff08;可以加qq群703185254、703185254咨询&#xff09; 2. schema文件&#xff08;备注中有准备&#xff0c;也可自己准备&#xff09; 3. 数据源。需要提前准备好foodmart的mysql数据库脚本。可以点击[下载]获得。 2 操作步骤 2.1 使用管…

saiku的简单配置及使用

一saiku的配置及使用 1 saiku主要页面介绍2 saiku配置步骤3 数据查询的简单使用示例4 saiku相关博客资料推荐 一、saiku的配置及使用 Saiku提供了一个多维分析的用户操作界面&#xff0c;可以通过简单拖拉拽的方式迅速生成报表。Saiku的主要工作是根据事先配置好的schema&a…

安装mysql提示3306端口已经被占用解决方案

今天遇到的问题是这样的&#xff0c;之前已经安装过mysql了&#xff0c;一直用的好好的&#xff0c;但是今天开启服务时报异常&#xff0c;无法启动。为了省事&#xff0c;于是想到卸载重装&#xff0c;在安装的过程中发现3306已经被占用&#xff0c;这也是一开始服务无法启动的…

centos如何对外开放80,3306端口号或者其他端口号

由于centos版本不同&#xff0c;开启端口号方式也不一样&#xff0c;centos6是iptables&#xff0c;centos7是firewall。 查看防火墙对外开放了哪些端口 iptables -L -n centos6.0防火墙操作&#xff1a; 配置文件&#xff1a;/etc/sysconfig/iptables 开启某个端口号有两种…

MySql安装出现3306端口!解决方法亲测成功

#MySql安装出现3306端口&#xff01; 分析原因1&#xff1a;其他程序占用了此端口 分析原因2&#xff1a;之前装了MySql没卸载&#xff0c;或没卸载干净&#xff0c;导致占用端口 亲测解决方法1&#xff1a; 第一步先打开任务管理器看有没有MySql的进程运行 右键选择打开文件…

mysql 的 3306、33060 端口区别

Port 3306 is the default port for the MySQL Protocol, which is used by the mysql client, MySQL Connectors, and utilities such as mysqldump and mysqlpump. Port 33060 is the default port for the MySQL Database Extended Interface (the MySQL X Protocol). 出处&…

MySQL的端口不止3306,还有33060、33061、33062等等

前提&#xff1a;你的Linux服务器上运行的是MySQL 5.7或MySQL 8.0 当使用netstat 命令查看网络状态时&#xff0c;你会发现mysqld占用了两个端口&#xff0c;分别是3306和33060。 netstat -tnulp | grep mysqld实际上&#xff0c;MySQL还使用了更多端口&#xff0c;更多权威信…

【踩坑】在linux服务器上配置mysql并开放3306端口

在做大作业&#xff0c;数据库零基础&#xff0c;折腾了一天才搞成功&#xff0c;特此记录一下踩过的坑。希望能帮到其他同学吧…… 有不对欢迎指出&#xff0c;谢谢啦&#xff01; 安装mysql 首先 sudo apt update sudo apt install mysql-server -y嗯&#xff0c;安装完了…

MySQL报错端口3306解决方法

安装MySQL时候回报错一些错误&#xff0c;比如文件中文名&#xff0c;但是比较最常见的就是端口号3306的占用。 在之前的MySQL安装&#xff1a;https://blog.csdn.net/qq_41879385/article/details/82215828&#xff0c;我就有遇到过这个问题。接下来看下面。 我们在安装的时…

mysql 的 3306、33060 端口区别,33060、33061、33062的区别,如何查看以及验证

当连接sql主机时&#xff0c;端口号3306、33060 端口有不同 如何验证 MySQL 服务器上的这些端口的值&#xff0c;以及这些端口的区别 MySQL使用不同的端口&#xff0c;在于使用的组件&#xff0c;启用的功能和应用程序的连接方式以及环境各方面因素 客户端 - 服务器连接端口…