3
3
import static org .springframework .http .HttpHeaders .REFERER ;
4
4
5
5
import java .io .IOException ;
6
+ import java .util .ArrayList ;
7
+ import java .util .Arrays ;
8
+ import java .util .List ;
9
+ import java .util .stream .Collectors ;
6
10
import javax .servlet .FilterChain ;
7
11
import javax .servlet .ServletException ;
8
12
import javax .servlet .ServletRequest ;
@@ -21,25 +25,34 @@ public class SamlInvalidateSessionFilter extends GenericFilterBean {
21
25
private static final Logger log = LoggerFactory .getLogger (SamlInvalidateSessionFilter .class );
22
26
private final AntPathRequestMatcher matcher ;
23
27
24
- private final String idpEntityId ;
25
- private final String proxySpEntityId ;
26
- private final boolean proxyEnabled ;
27
- private final String oidcIssuer ;
28
28
private final SecurityContextLogoutHandler contextLogoutHandler ;
29
+ private final List <String > internalReferrers = new ArrayList <>();
29
30
30
31
public SamlInvalidateSessionFilter (String pattern ,
31
32
String idpEntityId ,
32
33
String oidcIssuer ,
33
- boolean proxyEnabled ,
34
34
String proxySpEntityId ,
35
- SecurityContextLogoutHandler contextLogoutHandler )
35
+ SecurityContextLogoutHandler contextLogoutHandler ,
36
+ String [] internalReferrers )
36
37
{
37
38
this .matcher = new AntPathRequestMatcher (pattern );
38
- this .idpEntityId = idpEntityId ;
39
- this .oidcIssuer = oidcIssuer ;
40
- this .proxyEnabled = proxyEnabled ;
41
- this .proxySpEntityId = proxySpEntityId ;
39
+ if (StringUtils .hasText (idpEntityId )) {
40
+ this .internalReferrers .add (idpEntityId );
41
+ }
42
+ if (StringUtils .hasText (oidcIssuer )) {
43
+ this .internalReferrers .add (oidcIssuer );
44
+ }
45
+ if (StringUtils .hasText (proxySpEntityId )) {
46
+ this .internalReferrers .add (proxySpEntityId );
47
+ }
42
48
this .contextLogoutHandler = contextLogoutHandler ;
49
+ if (internalReferrers != null && internalReferrers .length > 0 ) {
50
+ List <String > referrers = Arrays .asList (internalReferrers );
51
+ referrers = referrers .stream ().filter (StringUtils ::hasText ).collect (Collectors .toList ());
52
+ if (!referrers .isEmpty ()) {
53
+ this .internalReferrers .addAll (referrers );
54
+ }
55
+ }
43
56
}
44
57
45
58
@ Override
@@ -59,23 +72,15 @@ public void doFilter(ServletRequest request, ServletResponse response, FilterCha
59
72
}
60
73
61
74
private boolean isInternalReferer (String referer ) {
62
- if (!StringUtils .hasText (referer )) {
63
- // no referer, consider as internal
75
+ if (!StringUtils .hasText (referer )) { // no referer, consider as internal
64
76
return true ;
65
77
}
66
-
67
- boolean isInternal = referer .startsWith (oidcIssuer );
68
- if (!isInternal ) {
69
- if (proxyEnabled ) {
70
- // check if referer is PROXY (SP part)
71
- isInternal = referer .startsWith (proxySpEntityId );
72
- } else {
73
- // check if referer is IDP
74
- isInternal = referer .startsWith (idpEntityId );
78
+ for (String internal : internalReferrers ) {
79
+ if (referer .startsWith (internal )) {
80
+ return true ;
75
81
}
76
82
}
77
-
78
- log .debug ("Referer {} is internal: {}" , referer , isInternal );
79
- return isInternal ;
83
+ return false ;
80
84
}
85
+
81
86
}
0 commit comments