SpringBoot 集成CAS简单学习

打印 上一主题 下一主题

主题 903|帖子 903|积分 2709

CAS服务搭建

可以直接放在Tomcat中启动,这里可以为了方便直接用IDEA搭建启动。如果直接拉取示例代码以下内容都已修改完毕。拉取代码直接使用。

  • CAS提供了模板 Overlay Template,拉取 代码。
  • Idea新建Maven项目
  • 新建模块 cas-server,将下载的CAS模板解压后文件内的所有文件考入该模块中。
  • 修改项目该路径下overlays\org.apereo.cas.cas-server-webapp-tomcat-5.3.16\WEB-INF\classes\  的application.properties文件
  1.    # 取消票根对应的Cookie的Secure配置,否则非https无法完成单点登录(但是能达到每个应用都需要登录的目的)
  2.    cas.tgc.secure=false
  3.    # 使用services目录下的json配置初始化serviceRegistry
  4.    cas.serviceRegistry.initFromJson=true
  5.    # 配置允许登出后跳转到指定页面
  6.    cas.logout.followServiceRedirects=true
  7.    # 跳转到指定页面需要的参数名为 service
  8.    cas.logout.redirectParameter=service
复制代码

  • 修改项目该路径下overlays\org.apereo.cas.cas-server-webapp-tomcat-5.3.16\WEB-INF\classes\services 的 HTTPSandIMAPS-10000001.json,改为以下内容
  1.    "serviceId" : "^(https|http|imaps)://.*",
复制代码

  • Idea 配置 Tomcat

    选择本地的Tomcat

    选择项目

    配置完成,点击运行即可。
  • 浏览器访问 http://localhost:8483/cas/login ,用户:casuser,密码:Mellon。
SpringBoot 客户端项目测试

自动配置

首先引入自动配置依赖,并启用 @EnableCasClient 注解。
  1. <dependency>
  2.     <groupId>org.jasig.cas.client</groupId>
  3.     <artifactId>cas-client-support-springboot</artifactId>
  4.     <version>${cas.client.version}</version>
  5. </dependency>
复制代码
EnableCasClient 注解类引入了配置类 CasClientConfiguration,配置类中做了以下几件事:

  • casAuthenticationFilter() 创建了 认证过滤器
  • casValidationFilter() 创建了 验证票据过滤器
  • casHttpServletRequestWrapperFilter() 创建了请求对象的包装类
  • casAssertionThreadLocalFilter() 创建了将 Assertion 放到 ThreadLocal 的过滤器,对于获取不到HttpRequest 请求对象的情况这很有用
  • casSingleSignOutFilter() 创建了单点登出的过滤器
  • casSingleSignOutListener() 创建单点登出的Listener,用于监听登出事件,清理内存中单点登录会话缓存
  • SpringSecurityAssertionAutoConfiguration 兼容Spring Security的配置类
    其中对于单点登录最重要的是 casAuthenticationFilter()、casValidationFilter() 这两个方法,另外以上几个方法创建的对象类都在 cas-client-core.jar ,也就是说可以只引这一个包,然后自行配置。
YML配置,两个客户端类似。
  1. server:
  2.   port: 8480
  3. cas:
  4.   # cas服务端的地址
  5.   server-url-prefix: http://127.0.0.1:8483/cas
  6.   # cas服务端的登录地址
  7.   server-login-url: http://127.0.0.1:8483/cas/login
  8.   # 当前服务器的地址(客户端)
  9.   client-host-url: http://localhost:8480
  10.   # Ticket校验器使用Cas30ProxyReceivingTicketValidationFilter
  11.   validation-type: cas3
复制代码
客户端一
  1. @Controller
  2. public class TestController {
  3.     @ResponseBody
  4.     @RequestMapping("/sso-test1")
  5.     public String test1(HttpSession session){
  6.         Assertion assertion = (Assertion)session.getAttribute(CONST_CAS_ASSERTION);
  7.         AttributePrincipal principal = assertion.getPrincipal();
  8.         String loginName = principal.getName();
  9.         return "sso-test1,当前登录账户"+loginName;
  10.     }
  11.     /**
  12.      * 退出 后自动重定向自定义接口
  13.      */
  14.     @RequestMapping("/system/logout1")
  15.     public String logout1(HttpServletRequest request) {
  16.         HttpSession session = request.getSession();
  17.         session.invalidate();
  18.         return "redirect:http://127.0.0.1:8483/cas/logout?service=http://localhost:8480/system/logoutSuccess";
  19.     }
  20.     /**
  21.      * 退出成功页
  22.      */
  23.     @RequestMapping("/system/logoutSuccess")
  24.     @ResponseBody
  25.     public String logoutSuccess() {
  26.         return "test2成功退出!";
  27.     }
  28. }
复制代码
客户端二
  1. @Controller
  2. public class TestController {
  3.     @ResponseBody
  4.     @RequestMapping("/sso-test2")
  5.     public String test1(HttpSession session){
  6.         Assertion assertion = (Assertion)session.getAttribute(CONST_CAS_ASSERTION);
  7.         AttributePrincipal principal = assertion.getPrincipal();
  8.         String loginName = principal.getName();
  9.         return "sso-test2,当前登录账户"+loginName;
  10.     }
  11.     /**
  12.      * 退出 后自动重定向自定义接口
  13.      */
  14.     @RequestMapping("/system/logout2")
  15.     public String logout1(HttpServletRequest request) {
  16.         HttpSession session = request.getSession();
  17.         session.invalidate();
  18.         return "redirect:http://127.0.0.1:8483/cas/logout?service=http://localhost:8481/system/logoutSuccess";
  19.     }
  20.     /**
  21.      * 退出成功页
  22.      */
  23.     @RequestMapping("/system/logoutSuccess")
  24.     @ResponseBody
  25.     public String logoutSuccess() {
  26.         return "test2成功退出!";
  27.     }
  28. }
复制代码
测试

CAS服务器未登录时测试:
访问 http://localhost:8480/sso-test1 ,跳转至 http://127.0.0.1:8483/cas/login页面。
访问 http://localhost:8480/sso-test2 ,跳转至 http://127.0.0.1:8483/cas/login页面。
CAS服务器登录时测试:
访问 http://localhost:8480/sso-test1 ,返回 sso-test1,当前登录账户casuser。
访问 http://localhost:8480/sso-test2 ,返回 sso-test2,当前登录账户casuser。
CAS服务器登录后登出时测试:
访问 http://localhost:8480/sso-test1 ,跳转至 http://127.0.0.1:8483/cas/login页面。
访问 http://localhost:8480/sso-test2 ,返回 sso-test2,当前登录账户casuser。
客户端一执行system/logout1登出方法测试:
访问 http://localhost:8480/system/logout1 ,未跳到指定方法/system/logoutSuccess,跳转至 http://127.0.0.1:8483/cas/login页面。
访问 http://localhost:8480/system/logout2,未跳到指定方法/system/logoutSuccess,跳转至 http://127.0.0.1:8483/cas/login页面。
客户端二执行system/logout2登出方法测试:
访问 http://localhost:8480/system/logout1 ,未跳到指定方法/system/logoutSuccess,跳转至 http://127.0.0.1:8483/cas/login页面。
访问 http://localhost:8480/system/logout2,未跳到指定方法/system/logoutSuccess,跳转至 http://127.0.0.1:8483/cas/login页面。
手动配置

可以看到上方没有跳转到指定方法/system/logoutSuccess。现在加入手动配置类,加入设置忽略方法。
  1. package com.blackcatcas.config;
  2. import org.jasig.cas.client.authentication.AuthenticationFilter;
  3. import org.springframework.beans.factory.annotation.Value;
  4. import org.springframework.boot.web.servlet.FilterRegistrationBean;
  5. import org.springframework.context.annotation.Bean;
  6. import org.springframework.context.annotation.Configuration;
  7. import java.util.HashMap;
  8. import java.util.Map;
  9. /**
  10. * 描述 :CAS 配置类
  11. * @author : zhangdahui
  12. * @date : 2022/8/2 10:07
  13. */
  14. @Configuration
  15. public class Config {
  16.     @Value("${cas.server-url-prefix}")
  17.     private String prefix;
  18.     @Value("${cas.server-login-url}")
  19.     private String login;
  20.     @Value("${cas.client-host-url}")
  21.     private String client;
  22.     /**
  23.      * description:授权过滤器
  24.      */
  25.     @Bean
  26.     public FilterRegistrationBean filterAuthenticationRegistration() {
  27.         FilterRegistrationBean registration = new FilterRegistrationBean();
  28.         registration.setFilter(new AuthenticationFilter());
  29.         // 设定匹配的路径
  30.         registration.addUrlPatterns("/*");
  31.         Map<String,String>  initParameters = new HashMap<>();
  32.         initParameters.put("casServerLoginUrl", login);
  33.         initParameters.put("serverName", client);
  34.         //设置忽略  退出登录不用登录CAS
  35.         initParameters.put("ignorePattern", "/system/*");
  36.         registration.setInitParameters(initParameters);
  37.         // 设定加载的顺序
  38.         registration.setOrder(1);
  39.         return registration;
  40.     }
  41. }
复制代码
现在访问 http://localhost:8480/system/logout1 ,跳转到指定方法/system/logoutSuccess,返回:test2成功退出!
示例代码

https://gitee.com/kylin_lawliet/springboot-cas.git

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

卖不甜枣

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表