shiro buji pac4j cas单点退出不起作用

问题描述 投票:0回答:1

弹簧靴2.2.5

shiro-spring-boot-web-starter 1.5.1

buji-pac4j 4.1.1

pac4j-cas 3.8.3

cas覆盖模板5.3。

我在tomcat中使用https启动cas服务器,并在eclipse中启动两个客户端(pac4j1pac4j2)。>>

单点登录有效,但single sign out失败。

以下是我的配置:

我仅在cas服务器下添加了[[one

service文件,如下所示:{ "@class": "org.apereo.cas.services.RegexRegisteredService", "serviceId": "^(http)://localhost.*", "name": "local", "id": 10000003, "evaluationOrder": 1 }
pac4j1的application.yml:

server: port: 8444 servlet: context-path: /pac4j1 cas: client-name: pac4j1Client server: url: https://localhost:8443/cas project: url: http://localhost:8444/pac4j1

Pac4jConfig:

@Configuration public class Pac4jConfig { @Value("${cas.server.url}") private String casServerUrl; @Value("${cas.project.url}") private String projectUrl; @Value("${cas.client-name}") private String clientName; @Bean("authcConfig") public Config config(CasClient casClient, ShiroSessionStore shiroSessionStore) { Config config = new Config(casClient); config.setSessionStore(shiroSessionStore); return config; } @Bean public ShiroSessionStore shiroSessionStore(){ return new ShiroSessionStore(); } @Bean public CasClient casClient(CasConfiguration casConfig){ CasClient casClient = new CasClient(casConfig); casClient.setCallbackUrl(projectUrl + "/callback?client_name=" + clientName); casClient.setName(clientName); return casClient; } @Bean public CasConfiguration casConfig(){ final CasConfiguration configuration = new CasConfiguration(); configuration.setLoginUrl(casServerUrl + "/login"); configuration.setProtocol(CasProtocol.CAS20); configuration.setAcceptAnyProxy(true); configuration.setPrefixUrl(casServerUrl + "/"); return configuration; } }

shiro配置:

@Configuration public class ShiroConfig { @Value("${cas.project.url}") private String projectUrl; @Value("${cas.server.url}") private String casServerUrl; @Value("${cas.client-name}") private String clientName; @Bean("securityManager") public DefaultWebSecurityManager securityManager(Pac4jSubjectFactory subjectFactory, CasRealm casRealm){ DefaultWebSecurityManager manager = new DefaultWebSecurityManager(); manager.setRealm(casRealm); manager.setSubjectFactory(subjectFactory); return manager; } @Bean public CasRealm casRealm(){ CasRealm realm = new CasRealm(); realm.setClientName(clientName); realm.setCachingEnabled(false); realm.setAuthenticationCachingEnabled(false); realm.setAuthorizationCachingEnabled(false); return realm; } @Bean public Pac4jSubjectFactory subjectFactory(){ return new Pac4jSubjectFactory(); } @Bean public FilterRegistrationBean<SingleSignOutFilter> singleSignOutFilter() { FilterRegistrationBean<SingleSignOutFilter> bean = new FilterRegistrationBean<SingleSignOutFilter>(); bean.setName("singleSignOutFilter"); SingleSignOutFilter singleSignOutFilter = new SingleSignOutFilter(); singleSignOutFilter.setCasServerUrlPrefix(casServerUrl); singleSignOutFilter.setIgnoreInitConfiguration(true); bean.setFilter(singleSignOutFilter); bean.addUrlPatterns("/*"); bean.setEnabled(true); bean.setOrder(Ordered.HIGHEST_PRECEDENCE); return bean; } @Bean public FilterRegistrationBean<DelegatingFilterProxy> filterRegistrationBean() { FilterRegistrationBean<DelegatingFilterProxy> filterRegistration = new FilterRegistrationBean<DelegatingFilterProxy>(); filterRegistration.setFilter(new DelegatingFilterProxy("shiroFilter")); filterRegistration.addInitParameter("targetFilterLifecycle", "true"); filterRegistration.setEnabled(true); filterRegistration.addUrlPatterns("/*"); filterRegistration.setDispatcherTypes(DispatcherType.REQUEST, DispatcherType.FORWARD); return filterRegistration; } private void loadShiroFilterChain(ShiroFilterFactoryBean shiroFilterFactoryBean){ Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/", "securityFilter"); filterChainDefinitionMap.put("/index", "securityFilter"); filterChainDefinitionMap.put("/callback", "callbackFilter"); filterChainDefinitionMap.put("/logout", "logout"); filterChainDefinitionMap.put("/**","anon"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); } @Bean("shiroFilter") public ShiroFilterFactoryBean factory(DefaultWebSecurityManager securityManager, Config config) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); loadShiroFilterChain(shiroFilterFactoryBean); Map<String, Filter> filters = new HashMap<>(3); SecurityFilter securityFilter = new SecurityFilter(); securityFilter.setConfig(config); securityFilter.setClients(clientName); filters.put("securityFilter", securityFilter); MyCallbackFilter callbackFilter = new MyCallbackFilter(); callbackFilter.setConfig(config); callbackFilter.setDefaultUrl(projectUrl); filters.put("callbackFilter", callbackFilter); LogoutFilter logoutFilter = new LogoutFilter(); logoutFilter.setConfig(config); logoutFilter.setCentralLogout(true); logoutFilter.setLocalLogout(true); logoutFilter.setDefaultUrl(projectUrl + "/callback?client_name=" + clientName); filters.put("logout",logoutFilter); shiroFilterFactoryBean.setFilters(filters); return shiroFilterFactoryBean; } }

application.properties的[cas server是默认值,cas server使用https(https://localhost:8443/cas),而cas clients是http(http://localhost:8444/pac4j1)。

我在哪里错?

spring boot 2.2.5 shiro-spring-boot-web-starter 1.5.1 buji-pac4j 4.1.1 pac4j-cas 3.8.3 cas覆盖模板5.3。我使用https在tomcat中启动cas服务器,并启动了两个客户端(pac4j1和pac4j2)...
spring-boot single-sign-on cas shiro pac4j
1个回答
0
投票
借助于SLO提供的链接leopal,我知道cas服务器需要将注销请求发送回客户端。
© www.soinside.com 2019 - 2024. All rights reserved.