springboot集成cas5.3如何实现sso单点登录
springboot集成cas5.3如何实现sso单点登录
这篇文章主要介绍springboot集成cas5.3如何实现sso单点登录,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!
什么是单点登录?
单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。
我们目前的系统存在诸多子系统,而这些子系统是分别部署在不同的服务器中,那么使用传统方式的session是无法解决的,我们需要使用相关的单点登录技术来解决。
SSO单点登录访问流程主要有以下步骤:
访问服务:SSO客户端发送请求访问应用系统提供的服务资源。
定向认证:SSO客户端会重定向用户请求到SSO服务器。
用户认证:用户身份认证。
发放票据:SSO服务器会产生一个随机的Service Ticket。
验证票据:SSO服务器验证票据Service Ticket的合法性,验证通过后,允许客户端访问服务。
传输用户信息:SSO服务器验证票据通过后,传输用户认证结果信息给客户端。
cas服务端部署
地址:https://github.com/apereo/cas-overlay-template/tree/5.3
1、解压下载的zip压缩包
2、解压后使用maven命令打包
mvn package
3、把target下生成的war包重命名为cas.war放到tomcat下
4、启动tomcat
5、找到解压的文件
由于cas默认使用的是基于https协议,需要改为兼容使用http协议,打开对应你的目录文件:
D:\tomcat8\webapps\cas\WEB-INF\classes\application.properties
修改application.properties文件,添加下面配置,使用http
#使用http协议cas.tgc.secure=falsecas.serviceRegistry.initFromJson=true#由于https协议默认使用的端口为8443,还需我们修改为tomcat的8080端口server.port=8080
修改HTTPSandIMAPS-10000001.json文件
D:\tomcat8\webapps\cas\WEB-INF\classes\services目录下的HTTPSandIMAPS-10000001.json
把原来的serviceId内容改成如下
"serviceId" : "^(https|http|imaps)://.*",
兼容http修改完毕。
修改配置中的登录用户名密码
cas.authn.accept.users=yyh::123456
cas服务器端搭建完毕,重启tomcat 进行测试,在浏览器中输入下面地址,进行访问
http://localhost:8080/cas/login
服务端就已经搭好了,并且可以通过登录退出了。
cas客户端搭建
在新建的springboot项目的pom.xml添加如下依赖(匹配对应的版本)
<dependency><groupId>net.unicon.cas</groupId><artifactId>cas-client-autoconfig-support</artifactId><version>2.3.0-GA</version></dependency>
在resources下新建application.properties
server.port=8088#cas服务端的地址cas.server-url-prefix=http://localhost:8080/cas#cas服务端的登录地址cas.server-login-url=http://localhost:8080/cas/login#当前服务器的地址(客户端)cas.client-host-url=http://localhost:8081#Ticket校验器使用Cas30ProxyReceivingTicketValidationFiltercas.validation-type=cas3
Application启动类上添加注解
importnet.unicon.cas.client.configuration.EnableCasClient;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;//启用cas@EnableCasClient@SpringBootApplicationpublicclassCasClient2Application{publicstaticvoidmain(String[]args){SpringApplication.run(CasClient2Application.class,args);}}
第一个客户端的controller
importorg.jasig.cas.client.authentication.AttributePrincipal;importorg.jasig.cas.client.validation.Assertion;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjavax.servlet.http.HttpSession;importstaticorg.jasig.cas.client.util.AbstractCasFilter.CONST_CAS_ASSERTION;@RestControllerpublicclasscontroller{@RequestMapping("/sso-test1")publicStringtest1(HttpSessionsession){Assertionassertion=(Assertion)session.getAttribute(CONST_CAS_ASSERTION);AttributePrincipalprincipal=assertion.getPrincipal();StringloginName=principal.getName();return"sso-test1,当前登录账户"+loginName;}}
一个客户端就添加好了,添加另一个客户端出端口其他基本也是一样
第二个客户端的controller
importorg.jasig.cas.client.authentication.AttributePrincipal;importorg.jasig.cas.client.validation.Assertion;importorg.springframework.boot.autoconfigure.EnableAutoConfiguration;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.RestController;importjavax.servlet.http.HttpSession;importstaticorg.jasig.cas.client.util.AbstractCasFilter.CONST_CAS_ASSERTION;@RestControllerpublicclasscontroller{@RequestMapping("/sso-test2")publicStringtest1(HttpSessionsession){Assertionassertion=(Assertion)session.getAttribute(CONST_CAS_ASSERTION);AttributePrincipalprincipal=assertion.getPrincipal();StringloginName=principal.getName();return"sso-test222222,当前登录账户"+loginName;}}
效果
在没有登录的情况下访问 http://localhost:8081/sso-test1
直接跳到了登录界面,并且把回调地址也带上了
访问第二个客户端 http://localhost:8082/sso-test2
跟第一个也是一样,这次我们随便登录一个
登录后,执行了回调接口,刷新一下第一个客户端的地址
也登录成功了。
配置统一登出
添加登出接口controller
/***退出后自动重定向自定义接口*@paramrequest*@return*/@RequestMapping("/system/logout1")publicStringlogout1(HttpServletRequestrequest){HttpSessionsession=request.getSession();session.invalidate();return"redirect:http://localhost:8080/cas/logout?service=http://localhost:8081/system/logoutSuccess";}/***退出成功页*@return*/@RequestMapping("/system/logoutSuccess")@ResponseBodypublicStringlogoutSuccess(){return"test1成功退出!";}
设置cas认证中心允许重定向跳转
打开你的cas认证中心里的 application.properties 文件,添加如下配置
#退出登录后允许跳转cas.logout.followServiceRedirects=true
新建config配置文件
importorg.jasig.cas.client.authentication.AuthenticationFilter;importorg.jasig.cas.client.session.SingleSignOutFilter;importorg.jasig.cas.client.session.SingleSignOutHttpSessionListener;importorg.jasig.cas.client.util.HttpServletRequestWrapperFilter;importorg.jasig.cas.client.validation.Cas30ProxyReceivingTicketValidationFilter;importorg.springframework.boot.web.servlet.FilterRegistrationBean;importorg.springframework.boot.web.servlet.ServletListenerRegistrationBean;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importjava.util.EventListener;importjava.util.HashMap;importjava.util.Map;@Configurationpublicclassconfig{//cas认证服务中心地址privatestaticfinalStringCAS_SERVER_URL_PREFIX="http://localhost:8080/cas/";//cas认证服务中心系统登录地址privatestaticfinalStringCAS_SERVER_URL_LOGIN="http://localhost:8080/cas/login";//你自己的客户端1的地址privatestaticfinalStringSERVER_NAME="http://localhost:8081/";/***description:登录过滤器*@param:[]*@return:org.springframework.boot.web.servlet.FilterRegistrationBean*/@BeanpublicFilterRegistrationBeanfilterSingleRegistration(){FilterRegistrationBeanregistration=newFilterRegistrationBean();registration.setFilter(newSingleSignOutFilter());//设定匹配的路径registration.addUrlPatterns("/*");Map<String,String>initParameters=newHashMap<String,String>();initParameters.put("casServerUrlPrefix",CAS_SERVER_URL_PREFIX);registration.setInitParameters(initParameters);//设定加载的顺序registration.setOrder(1);returnregistration;}/***description:过滤验证器**@param:[]*@return:org.springframework.boot.web.servlet.FilterRegistrationBean*/@BeanpublicFilterRegistrationBeanfilterValidationRegistration(){FilterRegistrationBeanregistration=newFilterRegistrationBean();registration.setFilter(newCas30ProxyReceivingTicketValidationFilter());//设定匹配的路径registration.addUrlPatterns("/*");Map<String,String>initParameters=newHashMap<String,String>();initParameters.put("casServerUrlPrefix",CAS_SERVER_URL_PREFIX);initParameters.put("serverName",SERVER_NAME);initParameters.put("useSession","true");registration.setInitParameters(initParameters);//设定加载的顺序registration.setOrder(1);returnregistration;}/***description:授权过滤器*@param:[]*@return:org.springframework.boot.web.servlet.FilterRegistrationBean*/@BeanpublicFilterRegistrationBeanfilterAuthenticationRegistration(){FilterRegistrationBeanregistration=newFilterRegistrationBean();registration.setFilter(newAuthenticationFilter());//设定匹配的路径registration.addUrlPatterns("/*");Map<String,String>initParameters=newHashMap<String,String>();initParameters.put("casServerLoginUrl",CAS_SERVER_URL_LOGIN);initParameters.put("serverName",SERVER_NAME);//设置忽略退出登录不用登录initParameters.put("ignorePattern","/system/*");registration.setInitParameters(initParameters);//设定加载的顺序registration.setOrder(1);returnregistration;}/***wraper过滤器*@return*/@BeanpublicFilterRegistrationBeanfilterWrapperRegistration(){FilterRegistrationBeanregistration=newFilterRegistrationBean();registration.setFilter(newHttpServletRequestWrapperFilter());//设定匹配的路径registration.addUrlPatterns("/*");//设定加载的顺序registration.setOrder(1);returnregistration;}/***添加监听器*@return*/@BeanpublicServletListenerRegistrationBean<EventListener>singleSignOutListenerRegistration(){ServletListenerRegistrationBean<EventListener>registrationBean=newServletListenerRegistrationBean<EventListener>();registrationBean.setListener(newSingleSignOutHttpSessionListener());registrationBean.setOrder(1);returnregistrationBean;}}
客户端2跟客户端1的大似相同,这样就可以实现登出一个系统,所有系统全部登出。
以上是“springboot集成cas5.3如何实现sso单点登录”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注恰卡编程网行业资讯频道!
推荐阅读
-
PHP开发SSO单点登录需要注意的问题
-
springboot实现基于aop的切面日志
本文实例为大家分享了springboot实现基于aop的切面日志的具体代码,供大家参考,具体内容如下通过aop的切面方式实现日志...
-
SpringBoot定时任务功能怎么实现
-
SpringBoot中的@Import注解怎么使用
-
SpringBoot整合Lombok及常见问题怎么解决
-
springboot图片验证码功能模块怎么实现
-
Springboot+SpringSecurity怎么实现图片验证码登录
-
SpringBoot注解的知识点有哪些
SpringBoot注解的知识点有哪些这篇“SpringBoot注...
-
SpringBoot2.x中management.security.enabled=false无效怎么解决
-
springboot怎么禁用某项健康检查
springboot怎么禁用某项健康检查今天小编给大家分享一下sp...