Skip to content

Commit a152636

Browse files
Kehrlannrwinch
authored andcommitted
webauthn: introduce DefaultResourcesFilter#webauthn
1 parent ca1f891 commit a152636

File tree

2 files changed

+71
-16
lines changed

2 files changed

+71
-16
lines changed

web/src/main/java/org/springframework/security/web/authentication/ui/DefaultResourcesFilter.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,21 @@ public static DefaultResourcesFilter css() {
9494
new MediaType("text", "css", StandardCharsets.UTF_8));
9595
}
9696

97+
/**
98+
* Create an instance of {@link DefaultResourcesFilter} serving Spring Security's
99+
* default webauthn javascript.
100+
* <p>
101+
* The created {@link DefaultResourcesFilter} matches requests
102+
* {@code HTTP GET /login/webauthn.js}, and returns the default webauthn javascript at
103+
* {@code org/springframework/security/spring-security-webauthn.js} with content-type
104+
* {@code text/javascript;charset=UTF-8}. This file is generated in the
105+
* {@code spring-security-javascript} project.
106+
* @return -
107+
*/
108+
public static DefaultResourcesFilter webauthn() {
109+
return new DefaultResourcesFilter(AntPathRequestMatcher.antMatcher(HttpMethod.GET, "/login/webauthn.js"),
110+
new ClassPathResource("org/springframework/security/spring-security-webauthn.js"),
111+
new MediaType("text", "javascript", StandardCharsets.UTF_8));
112+
}
113+
97114
}

web/src/test/java/org/springframework/security/web/authentication/ui/DefaultResourcesFilterTests.java

Lines changed: 54 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616

1717
package org.springframework.security.web.authentication.ui;
1818

19+
import org.junit.jupiter.api.Nested;
1920
import org.junit.jupiter.api.Test;
2021

2122
import org.springframework.test.web.servlet.MockMvc;
@@ -33,27 +34,64 @@
3334
*/
3435
public class DefaultResourcesFilterTests {
3536

36-
private final DefaultResourcesFilter filter = DefaultResourcesFilter.css();
37+
@Nested
38+
class CssFilter {
3739

38-
private final MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new Object()).addFilters(this.filter).build();
40+
private final DefaultResourcesFilter cssFilter = DefaultResourcesFilter.css();
3941

40-
@Test
41-
public void doFilterThenRender() throws Exception {
42-
this.mockMvc.perform(get("/default-ui.css"))
43-
.andExpect(status().isOk())
44-
.andExpect(content().contentType("text/css;charset=UTF-8"))
45-
.andExpect(content().string(containsString("body {")));
46-
}
42+
private final MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new Object())
43+
.addFilters(this.cssFilter)
44+
.build();
45+
46+
@Test
47+
void doFilterThenRender() throws Exception {
48+
this.mockMvc.perform(get("/default-ui.css"))
49+
.andExpect(status().isOk())
50+
.andExpect(content().contentType("text/css;charset=UTF-8"))
51+
.andExpect(content().string(containsString("body {")));
52+
}
53+
54+
@Test
55+
void doFilterWhenPathDoesNotMatchThenCallsThrough() throws Exception {
56+
this.mockMvc.perform(get("/does-not-match")).andExpect(status().isNotFound());
57+
}
58+
59+
@Test
60+
void toStringPrintsPathAndResource() {
61+
assertThat(this.cssFilter.toString()).isEqualTo(
62+
"DefaultResourcesFilter [matcher=Ant [pattern='/default-ui.css', GET], resource=org/springframework/security/default-ui.css]");
63+
}
4764

48-
@Test
49-
public void doFilterWhenPathDoesNotMatchThenCallsThrough() throws Exception {
50-
this.mockMvc.perform(get("/does-not-match")).andExpect(status().isNotFound());
5165
}
5266

53-
@Test
54-
void toStringPrintsPathAndResource() {
55-
assertThat(this.filter.toString()).isEqualTo(
56-
"DefaultResourcesFilter [matcher=Ant [pattern='/default-ui.css', GET], resource=org/springframework/security/default-ui.css]");
67+
@Nested
68+
class WebAuthnFilter {
69+
70+
private final DefaultResourcesFilter webauthnFilter = DefaultResourcesFilter.webauthn();
71+
72+
private final MockMvc mockMvc = MockMvcBuilders.standaloneSetup(new Object())
73+
.addFilters(this.webauthnFilter)
74+
.build();
75+
76+
@Test
77+
void doFilterThenRender() throws Exception {
78+
this.mockMvc.perform(get("/login/webauthn.js"))
79+
.andExpect(status().isOk())
80+
.andExpect(content().contentType("text/javascript;charset=UTF-8"))
81+
.andExpect(content().string(containsString("async function authenticate(")));
82+
}
83+
84+
@Test
85+
void doFilterWhenPathDoesNotMatchThenCallsThrough() throws Exception {
86+
this.mockMvc.perform(get("/does-not-match")).andExpect(status().isNotFound());
87+
}
88+
89+
@Test
90+
void toStringPrintsPathAndResource() {
91+
assertThat(this.webauthnFilter.toString()).isEqualTo(
92+
"DefaultResourcesFilter [matcher=Ant [pattern='/login/webauthn.js', GET], resource=org/springframework/security/spring-security-webauthn.js]");
93+
}
94+
5795
}
5896

5997
}

0 commit comments

Comments
 (0)