SpringBoot中Shiro使用Pac4j集成CAS认证-阿里云开发者社区

开发者社区> meijm0103> 正文

SpringBoot中Shiro使用Pac4j集成CAS认证

简介:
+关注继续查看

Pac4j 简介

Pac4j与Shiro,Spring Security一样都是权限框架,并且提供了OAuth - SAML - CAS - OpenID Connect - HTTP - OpenID - Google App Engine - Kerberos (SPNEGO) 的认证集成。且可以和shiro,security等权限框架集成。

Pac4j CAS认证流程

0_5988974176867581

代码 关键部分

说明: pac4j-cas与shiro的集成是通过过滤器完成cas认证,提供相应的Pac4jRealm来与shiro集成。代码过多就不一一列出了,详细的请下载附件,附件中代码屏蔽了公司相关代码。自身项目需要保持CAS与非CAS并存所以把CAS登录固定到指定路径了。

POM

<!--cas认证 -->
        <dependency>
            <groupId>org.pac4j</groupId>
            <artifactId>pac4j-cas</artifactId>
            <version>3.8.3</version>
        </dependency>
<!-- pac4j与shiro集成-->
        <dependency>
            <groupId>io.buji</groupId>
            <artifactId>buji-pac4j</artifactId>
            <version>4.1.1</version>
        </dependency>

JAVA配置

//Pac4jConfig.java 配置中
 @Bean
 public CasConfiguration casConfig() {
  final CasConfiguration configuration = new CasConfiguration();
  //CAS server登录地址
  configuration.setLoginUrl(casServerUrl + "/login");
  configuration.setAcceptAnyProxy(true);
  configuration.setPrefixUrl(casServerUrl + "/");
  //监控CAS服务端登出,登出后销毁本地session实现双向登出
  DefaultLogoutHandler logoutHandler = new DefaultLogoutHandler();
  logoutHandler.setDestroySession(true);
  configuration.setLogoutHandler(logoutHandler);
  return configuration;
 }
//ShiroConfig.java 中
//shiro 过滤器配置中增加SecurityFilter,CallbackFilter ,LogoutFilter 
 @Bean("shiroFilter")
 public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
  ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
  shiroFilterFactoryBean.setSecurityManager(securityManager);
  //获取filters
  Map<String, Filter> filters = shiroFilterFactoryBean.getFilters();
  filters.put("authc", new MySystemFilter());
  // cas 资源认证拦截器
  SecurityFilter securityFilter = new SecurityFilter();
  securityFilter.setConfig(exPac4jConfig);
  securityFilter.setClients(clientName);
  filters.put("securityFilter", securityFilter);
  //cas 认证后回调拦截器
  CallbackFilter callbackFilter = new CallbackFilter();
  callbackFilter.setConfig(exPac4jConfig);
  filters.put("callbackFilter", callbackFilter);
  shiroFilterFactoryBean.setFilters(filters);
  // 本地登出同步登出CAS服务器
  LogoutFilter pac4jCentralLogout = new LogoutFilter();
  pac4jCentralLogout.setConfig(exPac4jConfig);
  pac4jCentralLogout.setCentralLogout(true);
  pac4jCentralLogout.setLocalLogout(true);
  filters.put("pac4jCentralLogout", pac4jCentralLogout);
  //拦截器.
  Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
  filterChainDefinitionMap.put("/logout", "logout");
  filterChainDefinitionMap.put("/pac4jCentralLogout", "pac4jCentralLogout");
  filterChainDefinitionMap.put("/cas", "securityFilter");
  filterChainDefinitionMap.put("/callback", "callbackFilter");
  filterChainDefinitionMap.put("/**", "authc");
  shiroFilterFactoryBean.setLoginUrl("/login");
  shiroFilterFactoryBean.setSuccessUrl("index");
  shiroFilterFactoryBean.setUnauthorizedUrl("/error/403");
  shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
  return shiroFilterFactoryBean;
 }
 @Bean
 public SecurityManager securityManager() {
  DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
  securityManager.setAuthenticator(exModularRealmAuthenticator());
  List<Realm> realms = new ArrayList<>();
  realms.add(exSystemRealm());
 // casRealm继承Pac4jRealm 与shiro的Realm使用方法相同
  realms.add(casRealm);
  securityManager.setRealms(realms);
  securityManager.setCacheManager(redisCacheManager());
 //增加pac4jSubjectFactory
  securityManager.setSubjectFactory(pac4jSubjectFactory);
  securityManager.setRememberMeManager(cookieRememberMeManager());
  securityManager.setSessionManager(sessionManager());
  return securityManager;
 }

问题

  • 默认配置不支持CAS登出本地项目退出

重写ShiroSessionStore见ExShiroSessionStore.java

附件:链接: https://pan.baidu.com/s/1E-6uTYpOFn2ldAxd_k0XvQ 提取码: 8nhx

参考资料

https://www.cnblogs.com/suiyueqiannian/p/9359597.html

http://www.pac4j.org/docs/index.html

https://github.com/bujiio/buji-pac4j

https://github.com/gkaigk1987/shiro-pac4j-cas-demo

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云ACE认证云计算架构师考试内容范围
阿里云ACE高级认证云计算架构师考试考什么?来说说阿里云ACE高级认证云计算架构师考试试卷范围,本考试范围出自阿里云ACE云计算架构师考试大纲
810 0
Discord 公司如何使用 Cassandra 存储上亿条线上数据
Discord 是一款国外的类似 YY 的语音聊天软件。Discord 语音聊天软件及我们的 UGC 内容的增长速度比想象中要快得多。随着越来越多用户的加入,带来了更多聊天消息。2016 年 7 月,每天大约有 4 千万条消息;2016 年 12 月,每天超过亿条。
4299 0
SpringBoot 整合 Security(一)实现用户认证并判断返回json还是view
看这篇文章的我默认都认为是有security基本基础的,因为封装的缘故,没有基础的话很容易被绕晕。但是只要认真看,我相信没什么大问题,如果仅仅是会用,该教程让你更熟悉底层实现,更优雅的写代码。
979 0
ubuntu 无法使用 SSH root 账户远程访问
SSH服务器,可以通过SSH协议来访问远程服务器,代替telnet和ftp。但是ubuntu默认是不启用root用户也不允许root远程登录的,这应该是出于安全考虑。 解决方案一: 使用其它用户登录 解决方案
964 0
Spring Security笔记:HTTP Basic 认证
在第一节 Spring Security笔记:Hello World 的基础上,只要把Spring-Security.xml里改一个位置 1 2 3 4 注意第三行,加上后,再次访问/admin,会弹出下面的对话框: 有...
1321 0
Android使用Canvas实现跑马灯
  网上的很多的教程都是通过更改TextView的属性进行跑马灯的设计。这样做有很多的缺点: 1、如果TextView没有获取焦点,那么跑马灯的效果无法实现。
1094 0
ASP.NET Web API(二):安全验证之使用HTTP基本认证
在前一篇文章ASP.NET Web API(一):使用初探,GET和POST数据中,我们初步接触了微软的REST API: Web API。 我们在接触了Web API的后就立马发现了有安全验证的需求,所以这篇文章我们先来讨论下安全验证一个最简单的方法:使用HTTP基本认证。
828 0
Spring认证-Spring Framework 6 的 Java 17 和 Jakarta EE 9 基线
正如在 SpringOne 上宣布的那样,Spring Framework 6 和 Spring Boot 3 计划在 2022 年第四季度达到通用可用性的高端基准:
82 0
+关注
meijm0103
知其然,知其所以然
55
文章
5
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载