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認證流程
<ignore_js_op>
代碼 關鍵部分
說明: pac4j-cas與shiro的集成是通過過濾器完成cas認證,提供相應的Pac4jRealm來與shiro集成。代碼過多就不一一列出了,詳細的請下載附件,附件中代碼屏蔽了公司相關代碼。自身項目需要保持CAS與非CAS並存所以把CAS登錄固定到指定路徑了。
POM
[XML]
純文本查看 復制代碼
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
>[font=-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif][color=#24292e][b]
<!--cas認證 -->
[/b][/color][/font][/align][align=left][font=-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif][color=#24292e][b] <
dependency
>[/b][/color][/font][/align][align=left][font=-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif][color=#24292e][b] <
groupId
>org.pac4j</
groupId
>[/b][/color][/font][/align][align=left][font=-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif][color=#24292e][b] <
artifactId
>pac4j-cas</
artifactId
>[/b][/color][/font][/align][align=left][font=-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif][color=#24292e][b] <
version
>3.8.3</
version
>[/b][/color][/font][/align][align=left][font=-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif][color=#24292e][b] </
dependency
>[/b][/color][/font][/align][align=left][font=-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif][color=#24292e][b]
<!-- pac4j與shiro集成-->
[/b][/color][/font][/align][align=left][font=-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif][color=#24292e][b] <
dependency
>[/b][/color][/font][/align][align=left][font=-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif][color=#24292e][b] <
groupId
>io.buji</
groupId
>[/b][/color][/font][/align][align=left][font=-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif][color=#24292e][b] <
artifactId
>buji-pac4j</
artifactId
>[/b][/color][/font][/align][align=left][font=-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif][color=#24292e][b] <
version
>4.1.1</
version
>[/b][/color][/font][/align][align=left][font=-apple-system, system-ui, Segoe UI, Helvetica, Arial, sans-serif][color=#24292e][b] </
dependency
>[/b][/color][/font]/mw_shl_code][/align][align=left]JAVA配置[/align][align=left][mw_shl_code=java,true]//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
更多技術資訊可關注:itheimaGZ獲取