SpringBoot 基于 CAS 实现单点登录登出
共 7645字,需浏览 16分钟
·
2020-10-13 05:35
点击上方蓝色字体,选择“标星公众号”
优质文章,第一时间送达
作者 | d0usr
来源 | urlify.cn/uIfUV3
1、下载 CAS 5.3 源码:
git clone https://github.com/apereo/cas-overlay-template.git
由于以上命令会拷贝 CAS 的最新版本,如需切换到历史版本,可执行如下操作:
1)cd 到该项目下;
2)git log 查看提交记录,找到想要的提交记录,粘贴对应的哈希值;
3)执行 git checkout 哈希值;
这时本地的代码就会变成你想要的那个版本的代码。
2、将下载的源码导入 Idea:
(1)目录结构如下(CAS5.3 采用 maven 项目结构):
(2)打开 POM.XML 文件,更换 repositories :
central
aliyun maven
http://maven.aliyun.com/nexus/content/groups/public/
true
false
3、对源码进行打包:
打包完成后会生成一个 target 目录:
4、将打包后的 cas 文件夹复制到 tomcat 的 webapps 目录下:
5、修改CAS服务端配置文件:
(1)在 cas\WEB-INF\classes 目录的 application.properties 添加如下的内容:
# 自定义cas 登录用户名和密码为 admin
#cas.authn.accept.users=casuser::Mellon
cas.authn.accept.users=admin::admin
# 兼容 Http 协议
cas.tgc.secure=false
# 开启识别Json文件,默认false
cas.serviceRegistry.initFromJson=true
# 允许退出登录后重定向到其他页面
cas.logout.followServiceRedirects=true
(2)在 cas\WEB-INF\classes\services 目录下的 HTTPSandIMAPS-10000001.json:
修改内容如下,即添加http
"serviceId" : "^(https|http|imaps)://.*",
6、启动 tomcat 查看是否可以启动 CAS Server:
如上,已成功访问 CAS Server 登录页。
7、 CAS 客户端配置:
(1)项目结构:
项目结构为 maven 多模块工程,其中sp-common模块为公用模块;sp-member 为会员模块;sp-order 为订单模块。
(2)POM.XML 依赖:
net.unicon.cas
cas-client-autoconfig-support
2.1.0-GA
(3)application.yml 配置:
1)客户端 sp-member 模块配置如下:
server:
port: 8081
# 配置 cas server 信息
cas:
# cas服务端的地址
server-url-prefix: http://localhost:8080/cas
# cas服务端的登录地址
server-login-url: http://localhost:8080/cas/login
# 当前服务器的地址(客户端)
client-host-url: http://localhost:8081
# Ticket校验器使用Cas30ProxyReceivingTicketValidationFilter
validation-type: cas3
2)客户端 sp-order 模块配置如下:
server:
port: 8082
# 配置 cas server 信息
cas:
# cas服务端的地址
server-url-prefix: http://localhost:8080/cas
# cas服务端的登录地址
server-login-url: http://localhost:8080/cas/login
# 当前服务器的地址(客户端)
client-host-url: http://localhost:8082
# Ticket校验器使用Cas30ProxyReceivingTicketValidationFilter
validation-type: cas3
8、进行客户端测试:
(1)客户端 sp-member模块配置如下:
MemberController 类:
package member.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
public class MemberController {
@RequestMapping("/test")
@ResponseBody
public String test(HttpServletRequest request) {
return "member";
}
/**
* 退出
* @param request
* @return
*/
@RequestMapping("/logout")
public String logout(HttpServletRequest request) {
HttpSession session = request.getSession();
session.invalidate();
return "redirect:http://localhost:8080/cas/logout?service=http://localhost:8081/logoutSuccess";
}
/**
* 退出成功页
* @return
*/
@RequestMapping("/logoutSuccess")
@ResponseBody
public String logoutSuccess() {
return "member logoutSuccess";
}
}
StartMember8081类(启动类):
package member;
/**
* 会员服务启动类
*/
import net.unicon.cas.client.configuration.EnableCasClient;
import org.jasig.cas.client.authentication.AuthenticationFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import java.util.HashMap;
import java.util.Map;
@EnableCasClient // 开启 Cas Client 注解
@SpringBootApplication
public class StartMember8081 {
private static final String CAS_SERVER_URL_LOGIN = "http://localhost:8080/cas/login";
private static final String SERVER_NAME = "http://localhost:8081/";
@Bean
public FilterRegistrationBean filterAuthenticationRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
// AuthenticationFilter 该过滤器负责用户的认证工作
registration.setFilter(new AuthenticationFilter());
// 设定匹配的路径
registration.addUrlPatterns("/*");
Map initParameters = new HashMap();
initParameters.put("casServerLoginUrl", CAS_SERVER_URL_LOGIN);
initParameters.put("serverName", SERVER_NAME);
// 忽略 /logoutSuccess 的路径
initParameters.put("ignorePattern", "/logoutSuccess/*");
registration.setInitParameters(initParameters);
// 设定加载的顺序
registration.setOrder(1);
return registration;
}
public static void main(String[] args) {
SpringApplication.run(StartMember8081.class, args);
}
}
(2)客户端 sp-order 模块配置如下:
OrderController类:
package order.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
@Controller
public class OrderController {
@RequestMapping("/test")
@ResponseBody
public String test() {
return "order";
}
/**
* 退出
* @param request
* @return
*/
@RequestMapping("/logout")
public String logout(HttpServletRequest request) {
HttpSession session = request.getSession();
session.invalidate();
return "redirect:http://localhost:8080/cas/logout?service=http://localhost:8082/logoutSuccess";
}
/**
* 退出成功页
* @return
*/
@RequestMapping("/logoutSuccess")
@ResponseBody
public String logoutSuccess() {
return "order logoutSuccess";
}
}
StartOrder8082类(启动类):
package order;
import net.unicon.cas.client.configuration.EnableCasClient;
import org.jasig.cas.client.authentication.AuthenticationFilter;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import java.util.HashMap;
import java.util.Map;
/**
* 订单服务启动类
*/
@EnableCasClient // 开启 Cas Client 注解
@SpringBootApplication
public class StartOrder8082 {
private static final String CAS_SERVER_URL_LOGIN = "http://localhost:8080/cas/login";
private static final String SERVER_NAME = "http://localhost:8082/";
@Bean
public FilterRegistrationBean filterAuthenticationRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new AuthenticationFilter());
// 设定匹配的路径
registration.addUrlPatterns("/*");
Map initParameters = new HashMap();
initParameters.put("casServerLoginUrl", CAS_SERVER_URL_LOGIN);
initParameters.put("serverName", SERVER_NAME);
// 忽略 /logoutSuccess 的路径
initParameters.put("ignorePattern", "/logoutSuccess/*");
registration.setInitParameters(initParameters);
// 设定加载的顺序
registration.setOrder(1);
System.out.println("init filter");
return registration;
}
public static void main(String[] args) {
SpringApplication.run(StartOrder8082.class, args);
}
}
(3)测试访问(会员业务) http://localhost:8081/test 是否会被拦截:
如上,会员服务接口已被成功拦截,地址重定向了 CAS Server 的登录页面。
(4)测试访问(订单服务) http://localhost:8082/test 是否会被拦截:
如上,订单服务接口也成功被拦截。
(5)测试当一个客户端登录后,另外一个客户端是否可以访问:
如上,登录后成功返回会员服务内容。
如上,刷新刚刚订单服务请求地址,也成功返回订单服务内容。
(6)测试当一个客户端退出后,另外一个客户端是否还可以访问:
如上,先在浏览器访问 http://localhost:8081/logout 接口,url 重定到 http://localhost:8081/logoutSuccess 接口,即表示会员服务已退出。
这时再刷新之前两个服务的接口地址,均重定向到了 CAS Server 登录页,即实现了单点登出效果。
粉丝福利:Java从入门到入土学习路线图
???
?长按上方微信二维码 2 秒
感谢点赞支持下哈