1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.syncope.sra.security.cas;
20
21 import java.net.URI;
22 import org.apache.commons.lang3.StringUtils;
23 import org.apache.syncope.sra.SessionConfig;
24 import org.apache.syncope.sra.security.web.server.DoNothingIfCommittedServerRedirectStrategy;
25 import org.springframework.cache.CacheManager;
26 import org.springframework.security.core.Authentication;
27 import org.springframework.security.web.server.ServerRedirectStrategy;
28 import org.springframework.security.web.server.WebFilterExchange;
29 import org.springframework.security.web.server.authentication.logout.ServerLogoutHandler;
30 import reactor.core.publisher.Mono;
31
32 public class CASServerLogoutHandler implements ServerLogoutHandler {
33
34 private final ServerRedirectStrategy redirectStrategy = new DoNothingIfCommittedServerRedirectStrategy();
35
36 private final CacheManager cacheManager;
37
38
39
40
41 private final String casServerLogoutUrl;
42
43 public CASServerLogoutHandler(final CacheManager cacheManager, final String casServerUrlPrefix) {
44 this.cacheManager = cacheManager;
45 this.casServerLogoutUrl = StringUtils.appendIfMissing(casServerUrlPrefix, "/") + "logout";
46 }
47
48 @Override
49 public Mono<Void> logout(final WebFilterExchange exchange, final Authentication authentication) {
50 return exchange.getExchange().getSession().
51 flatMap(session -> {
52 cacheManager.getCache(SessionConfig.DEFAULT_CACHE).evictIfPresent(session.getId());
53
54 return session.invalidate().then(
55 redirectStrategy.sendRedirect(exchange.getExchange(), URI.create(this.casServerLogoutUrl)));
56 }).onErrorResume(Mono::error);
57 }
58 }