springboot整个cas_SpringBoot 基于 CAS 实现单点登录登出

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 项目结构):

efcd9c4b1c01b549f8b4db8a5c0c584c.png

(2)打开 POM.XML 文件,更换 repositories :

central

aliyun maven

http://maven.aliyun.com/nexus/content/groups/public/

true

false

3、对源码进行打包:

6c7d8fe682cc0d7d080cccc99201c056.png

打包完成后会生成一个 target 目录:

92d4605ae7b2853735667ffd9adf4ece.png

4、将打包后的 cas 文件夹复制到 tomcat 的 webapps 目录下:

581a993384a3d2b92fbb7ab9e5f0e622.png

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:

ab72492080f2dbb4de601ba57953e0ee.png

273dd439243a888b6de4ffac28eeb819.png

0f49d0954631a54c55bec742b2d255cf.png

如上,已成功访问 CAS Server 登录页。

7、 CAS 客户端配置:

(1)项目结构:

56247fc50ea1db8307f1ae6b05061608.png

项目结构为 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 类:

packagemember.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpSession;

@Controllerpublic classMemberController {

@RequestMapping("/test")

@ResponseBodypublicString test(HttpServletRequest request) {return "member";

}/*** 退出

*@paramrequest

*@return

*/@RequestMapping("/logout")publicString logout(HttpServletRequest request) {

HttpSession session=request.getSession();

session.invalidate();return "redirect:http://localhost:8080/cas/logout?service=http://localhost:8081/logoutSuccess";

}/*** 退出成功页

*@return

*/@RequestMapping("/logoutSuccess")

@ResponseBodypublicString logoutSuccess() {return "member logoutSuccess";

}

}

StartMember8081类(启动类):

packagemember;/*** 会员服务启动类*/

importnet.unicon.cas.client.configuration.EnableCasClient;importorg.jasig.cas.client.authentication.AuthenticationFilter;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.boot.web.servlet.FilterRegistrationBean;importorg.springframework.context.annotation.Bean;importjava.util.HashMap;importjava.util.Map;

@EnableCasClient//开启 Cas Client 注解

@SpringBootApplicationpublic classStartMember8081 {private static final String CAS_SERVER_URL_LOGIN = "http://localhost:8080/cas/login";private static final String SERVER_NAME = "http://localhost:8081/";

@BeanpublicFilterRegistrationBean filterAuthenticationRegistration() {

FilterRegistrationBean registration= newFilterRegistrationBean();//AuthenticationFilter 该过滤器负责用户的认证工作

registration.setFilter(newAuthenticationFilter());//设定匹配的路径

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);returnregistration;

}public static voidmain(String[] args) {

SpringApplication.run(StartMember8081.class, args);

}

}

(2)客户端 sp-order 模块配置如下:

OrderController类:

packageorder.controller;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpSession;

@Controllerpublic classOrderController {

@RequestMapping("/test")

@ResponseBodypublicString test() {return "order";

}/*** 退出

*@paramrequest

*@return

*/@RequestMapping("/logout")publicString logout(HttpServletRequest request) {

HttpSession session=request.getSession();

session.invalidate();return "redirect:http://localhost:8080/cas/logout?service=http://localhost:8082/logoutSuccess";

}/*** 退出成功页

*@return

*/@RequestMapping("/logoutSuccess")

@ResponseBodypublicString logoutSuccess() {return "order logoutSuccess";

}

}

StartOrder8082类(启动类):

packageorder;importnet.unicon.cas.client.configuration.EnableCasClient;importorg.jasig.cas.client.authentication.AuthenticationFilter;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;importorg.springframework.boot.web.servlet.FilterRegistrationBean;importorg.springframework.context.annotation.Bean;importjava.util.HashMap;importjava.util.Map;/*** 订单服务启动类*/@EnableCasClient//开启 Cas Client 注解

@SpringBootApplicationpublic classStartOrder8082 {private static final String CAS_SERVER_URL_LOGIN = "http://localhost:8080/cas/login";private static final String SERVER_NAME = "http://localhost:8082/";

@BeanpublicFilterRegistrationBean filterAuthenticationRegistration() {

FilterRegistrationBean registration= newFilterRegistrationBean();

registration.setFilter(newAuthenticationFilter());//设定匹配的路径

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");returnregistration;

}public static voidmain(String[] args) {

SpringApplication.run(StartOrder8082.class, args);

}

}

(3)测试访问(会员业务) http://localhost:8081/test 是否会被拦截:

6bd758fd06e1839fd6b717c46ee6662e.png

如上,会员服务接口已被成功拦截,地址重定向了 CAS Server 的登录页面。

(4)测试访问(订单服务) http://localhost:8082/test 是否会被拦截:

d4d5aef2c0216d94e989b081b12fc80a.png

如上,订单服务接口也成功被拦截。

(5)测试当一个客户端登录后,另外一个客户端是否可以访问:

6f400ae02d4f78437f33495751618477.png

如上,登录后成功返回会员服务内容。

11a6a719c61a25513afead1a9c8cec4e.png

如上,刷新刚刚订单服务请求地址,也成功返回订单服务内容。

(6)测试当一个客户端退出后,另外一个客户端是否还可以访问:

6033b92758ec02be7df5bc2731a95861.png

如上,先在浏览器访问 http://localhost:8081/logout 接口,url 重定到 http://localhost:8081/logoutSuccess 接口,即表示会员服务已退出。

这时再刷新之前两个服务的接口地址,均重定向到了 CAS Server 登录页,即实现了单点登出效果。

参考链接:https://www.jianshu.com/p/f2facc4d1c3a

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值