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獲取
