saiku集成CAS
最近一直在研究saiku如何集成公司的单点登录系统,通过google、百度搜集查阅了大量的相关资料,并和网友讨论最终在公司内部集成完成,最终测试上线;现将这一过程中的经验记录下来,分享给需要的朋友....
![](/assets/blank.gif)
<!-- <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
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并未退出成功,但是使用了第二种方式就正常了,这里做个标记;
![](/assets/blank.gif)
saiku集成CAS相关推荐
- web工程中集成cas单点登录
背景 cas的服务端已经搭建成功,现在需要在web项目中集成cas client.我们项目使用spring 1.在pom中配置 <!--cas单点登录 --><dependency& ...
- Jeesite单点登录集成Cas另加自定义登录验证
Jeesite单点登录集成Cas另加自定义登录验证 JeeSite是基于多个优秀的开源项目,高度整合封装而成的高效,高性能,强安全性的 开源 Java EE快速开发平台. Cas主要是用来解决多应用之 ...
- springmvc集成cas,并解决前后端分离情况
2019独角兽企业重金招聘Python工程师标准>>> 1.最近项目需要集成已经存在的cas系统. 但是目前已集成的系统都是jsp.而我们项目是前后端分离开发(伪),没有分开部署. ...
- 多服务集成CAS实现单点登录
简要概述实现步骤(思路): 1.创建web应用 2.集成CAS(使用CAS服务端内配置账户密码进行登录验证) 2.1导入jar包 2.2配置web.xml文件(拦截跳转验证以及验证结束返回) 3.配置 ...
- CAS学习笔记五:SpringBoot自动/手动配置方式集成CAS单点登出
本文目标 基于SpringBoot + Maven 分别使用自动配置与手动配置过滤器方式实现CAS客户端登出及单点登出. 本文基于<CAS学习笔记三:SpringBoot自动/手动配置方式集成C ...
- SSO、单点登录、集成 CAS、OAuth2
SSO.单点登录.集成 CAS.OAuth2 JeeSite 已经默认集成了两种单点登录方式(Single Sign On): 1.SSO(简单登录)接口,实现快速登录系统. 2.与 Apereo C ...
- python学习04--django集成CAS客户端
python学习04--django集成CAS客户端 前言 一.CAS客户端 1.新建一个Django项目,前面已讲, 2.安装依赖 3.配置Django_cas_ng,在settings文件中 4. ...
- java 集成 cas系统 服务端和客户端配置
http://blog.csdn.net/yunye114105/article/details/7997041 参考: http://blog.csdn.net/diyagea/article/de ...
- oauth最后的确认按钮_spring-oauth集成cas单点登录,登陆完成进入授权页面后,按回退按钮进入404页面的问题...
背景: 1.项目中使用耶鲁的cas做单点登录. 2.使用spring-oauth包实现oauth2服务 3.使用spring-cas做spring-security及cas的集成 现象: 开发报了个b ...
最新文章
- IOS- 堆和栈 详解
- Javascript获取url参数值
- MySQL主备复制原理、实现及异常处理
- 八种排序整理(六)----堆排序
- python 方程组 整数解_用Python语言求解线性整数方程组
- win10远程登陆deepin xrdp
- MongoDB Project Fields
- thinkphp5.0.6 连接SQLServer2008r2 配置总结
- 轻松掌握namedtuple
- VB串口通信技术资料:媒体/源码/论文/书籍/视频/控件/程序
- 使用js实现百度地图与高德地图经纬度的转换
- lucene-使用htmlparser解析未设定编码页面
- 后羿 11 ‖ 洛神
- 以《西游记》为例 详解游戏设计归纳演绎法
- HGDB 兼容 Oracle 中 merge into using(APP)
- (栈的应用5.2.2)POJ 2106 Boolean Expressions(表达式求值)
- Latex论文中用到的花体字
- IDEA 同时打开两个项目
- 写作业用白光还是暖白光?分享色温4000K暖白光的护眼台灯
- 从混合云存储看阿里云对下一代企业计算架构的思考
热门文章
- Bash for 循环使用方法
- spark 写入tidb 报错read-uncommitted is not supported
- 微信小程序之云菜谱的设计
- 大数据时代政府部门间信息资源共享策略探讨
- Word去除空白页,格式变动问题处理
- jQuery学习:scroll滚动 垂直滚动scrollTop 水平滚动scrollLeft
- 码绘与手绘的比较【动态篇】
- 开源中文词向量加载(训练好的词向量如何加载) tensorflow
- 哈利波特火了,伏地魔“活了“,网易游戏还是“千年老二“
- `computed`