CAS创建服务端:SSO单点登录(一)创建CAS服务端_我是混IT圈的-CSDN博客
由于CAS需要用到域名,所以需要把本地ip映射成域名,参考文档:Win10 如何把本地ip映射成域名_我是混IT圈的-CSDN博客
cas客户端示例下载:https://github.com/cas-projects/cas-sample-java-webapp
这个CAS客户端是一个maven项目,可以参考,但是如果想要和springboot整合,可以看下面的配置。
SpringBoot创建CAS客户端如下: SpringBoot的版本:pom.xml:2.4.10
配置文件:application.propertiesorg.springframework.boot spring-boot-starterorg.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-starter-thymeleafnet.unicon.cas cas-client-autoconfig-support2.0.0-GA
#端口号
server.port=8888
#CAS服务端的地址
cas.server-url-prefix=http://sso.cas.com:8080/cas
#客户端如果要登录,会跳转到统一的服务认证中的登录界面,也就是CAS服务端的登录地址
cas.server-login-url=http://sso.cas.com:8080/cas/login
#客户端在CAS服务端登录成功后,自动从CAS服务端跳转回客户端的地址
cas.client-host-url=http://a.cas.com:8888
#校验后的CAS服务端颁发给客户端的用户信息是否需要放入session中。session获取用户信息,key:_const_cas_assertion_ value:assertion
cas.use-session=true
#Ticket校验器使用 Cas30ProxyReceivingTicketValidationFilter
cas.validation-type=CAS3
#不需要拦截的请求,可以用*做模糊匹配,多个用【|】竖线隔开
udf.ignorePattern=/home.html|
@Configuration
public class CasConfig {
@Value("${cas.server-url-prefix}")
private String serverUrlPrefix;
@Value("${cas.server-login-url}")
private String serverLoginUrl;
@Value("${cas.client-host-url}")
private String clientHostUrl;
@Value("${udf.ignorePattern}")
private String ignorePattern;
@Value("${udf.ignoreUrlPatternType}")
private String ignoreUrlPatternType;
@Value("${cas.use-session}")
private String useSession;
@Bean
public FilterRegistrationBean filterSingleRegistration() {
final FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new SingleSignOutFilter());
// 设定匹配的路径
registration.addUrlPatterns("
@Bean
public ServletListenerRegistrationBean singleSignOutListenerRegistration() {
ServletListenerRegistrationBean registrationBean = new ServletListenerRegistrationBean<>();
registrationBean.setListener(new SingleSignOutHttpSessionListener());
// 设定加载的顺序
registrationBean.setOrder(1);
return registrationBean;
}
@Bean
public FilterRegistrationBean filterAuthenticationRegistration() {
final FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new AuthenticationFilter());
// 设定匹配的路径
registration.addUrlPatterns("
@Bean
public FilterRegistrationBean filterValidationRegistration() {
final FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new Cas30ProxyReceivingTicketValidationFilter());
// 设定匹配的路径
registration.addUrlPatterns("
@Bean
public FilterRegistrationBean filterWrapperRegistration() {
final FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new HttpServletRequestWrapperFilter());
// 设定匹配的路径
registration.addUrlPatterns("
public class SimpleUrlPatternMatcherStrategy implements UrlPatternMatcherStrategy {
//配置文件配置的不需要拦截的请求
private Pattern pattern;
@Override
public boolean matches(String url) {
//在此可以做额外的扩展,比如判断是insert也放行 可以通过查询数据库来进行动态判断
if(url.contains("/insert")){
return true;
}
//默认是根据 cas.ignore-pattern 来判断是否否满足过滤
return this.pattern.matcher(url).find();
}
@Override
public void setPattern(String pattern) {
this.pattern = Pattern.compile(pattern);
}
}
HomeController:
package com.example.casclientb.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import javax.servlet.http.HttpServletRequest;
@Controller
public class HomeController {
//首页,不需要登录就可以进来
@GetMapping(value = "/home.html")
public String index(HttpServletRequest request){
return "home";
}
//详情页面,需要登录
@GetMapping(value = "/details.html")
public String list(HttpServletRequest request){
//cas校验后保存到session中的用户信息,要在session中获取到这个信息,必须在配置中配置。
Object assertion = request.getSession().getAttribute("_const_cas_assertion_");
System.out.println(assertion);
return "details";
}
}
首页:home.html
Title
这里是淘宝首页,不需要登录
详情
详情页:details.html
Title
这是淘宝详情页面,需要登录
退出
首页
启动类,添加注解:
//启动CAS @EnableCasClient @EnableCasClient
由于CAS是默认使用https的,那么为了能测试,需要把CAS服务端配置成能使用http协议。如何配置成http,那么看这篇文章:SSO单点登录(一)创建CAS服务端_我是混IT圈的-CSDN博客
上面的配置都可以实现单点登录和单点退出的功能。下一篇文章请期待:shiro和cas的整合。



