Skip to content

Commit 9060ad5

Browse files
BushraAbdullahiemmalaniganemmalanigan
authored
HMAI-122 Add tests for existing AuthorisationFilter (#547)
* add authorisation filter tests to check onward chain is called and errors are generated Co-authored-by: emmalanigan <emma.lanigan@digital.justice.gov.uk> * add test to check it generates error when subject distinguished name is null in the request Co-authored-by: emma.lanigan <emma.lanigan@justice.gov.uk> * mock service in test for unauthorised requested path * Revert change to mock authorisation service. --------- Co-authored-by: emmalanigan <emma.lanigan@digital.justice.gov.uk> Co-authored-by: emmalanigan <emma.lanigan@justice.gov.uk>
1 parent 12484fa commit 9060ad5

File tree

2 files changed

+95
-24
lines changed

2 files changed

+95
-24
lines changed

src/main/kotlin/uk/gov/justice/digital/hmpps/hmppsintegrationapi/extensions/AuthorisationFilter.kt

+25-24
Original file line numberDiff line numberDiff line change
@@ -18,34 +18,35 @@ import java.io.IOException
1818
@Component
1919
@Order(1)
2020
@EnableConfigurationProperties(AuthorisationConfig::class)
21-
class AuthorisationFilter : Filter {
21+
class AuthorisationFilter
2222
@Autowired
23-
lateinit var authorisationConfig: AuthorisationConfig
23+
constructor(
24+
var authorisationConfig: AuthorisationConfig,
25+
) : Filter {
26+
@Throws(IOException::class, ServletException::class)
27+
override fun doFilter(
28+
request: ServletRequest,
29+
response: ServletResponse?,
30+
chain: FilterChain,
31+
) {
32+
val req = request as HttpServletRequest
33+
val res = response as HttpServletResponse
34+
val authoriseConsumerService = AuthoriseConsumerService()
35+
val subjectDistinguishedName = req.getAttribute("clientName") as String?
36+
val requestedPath = req.requestURI
2437

25-
@Throws(IOException::class, ServletException::class)
26-
override fun doFilter(
27-
request: ServletRequest,
28-
response: ServletResponse?,
29-
chain: FilterChain,
30-
) {
31-
val req = request as HttpServletRequest
32-
val res = response as HttpServletResponse
33-
val authoriseConsumerService = AuthoriseConsumerService()
34-
val subjectDistinguishedName = req.getAttribute("clientName") as String?
35-
val requestedPath = req.requestURI
38+
if (subjectDistinguishedName == null) {
39+
res.sendError(HttpServletResponse.SC_FORBIDDEN, "No subject-distinguished-name header provided for authorisation")
40+
return
41+
}
3642

37-
if (subjectDistinguishedName == null) {
38-
res.sendError(HttpServletResponse.SC_FORBIDDEN, "No subject-distinguished-name header provided for authorisation")
39-
return
40-
}
43+
val result = authoriseConsumerService.execute(subjectDistinguishedName, authorisationConfig.consumers, requestedPath)
4144

42-
val result = authoriseConsumerService.execute(subjectDistinguishedName, authorisationConfig.consumers, requestedPath)
45+
if (!result) {
46+
res.sendError(HttpServletResponse.SC_FORBIDDEN, "Unable to authorise $requestedPath for $subjectDistinguishedName")
47+
return
48+
}
4349

44-
if (!result) {
45-
res.sendError(HttpServletResponse.SC_FORBIDDEN, "Unable to authorise $requestedPath for $subjectDistinguishedName")
46-
return
50+
chain.doFilter(request, response)
4751
}
48-
49-
chain.doFilter(request, response)
5052
}
51-
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
package uk.gov.justice.digital.hmpps.hmppsintegrationapi.extensions
2+
3+
import jakarta.servlet.FilterChain
4+
import jakarta.servlet.http.HttpServletRequest
5+
import jakarta.servlet.http.HttpServletResponse
6+
import org.junit.jupiter.api.Test
7+
import org.mockito.Mockito.mock
8+
import org.mockito.Mockito.times
9+
import org.mockito.Mockito.verify
10+
import org.mockito.kotlin.whenever
11+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.config.AuthorisationConfig
12+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.roleconfig.ConsumerConfig
13+
import uk.gov.justice.digital.hmpps.hmppsintegrationapi.models.roleconfig.ConsumerFilters
14+
15+
class AuthorisationFilterTest {
16+
private var authorisationConfig: AuthorisationConfig = AuthorisationConfig()
17+
private var authorisationFilter: AuthorisationFilter = AuthorisationFilter(authorisationConfig)
18+
private var examplePath: String = "/v1/persons"
19+
private var exampleConsumer: String = "consumer-name"
20+
21+
@Test
22+
fun `calls the onward chain`() {
23+
// Arrange
24+
val mockRequest = mock(HttpServletRequest::class.java)
25+
whenever(mockRequest.requestURI).thenReturn(examplePath)
26+
whenever(mockRequest.getAttribute("clientName")).thenReturn(exampleConsumer)
27+
val mockResponse = mock(HttpServletResponse::class.java)
28+
val mockChain = mock(FilterChain::class.java)
29+
30+
authorisationConfig.consumers = mapOf(exampleConsumer to ConsumerConfig(include = listOf(examplePath), filters = ConsumerFilters(emptyMap())))
31+
32+
// Act
33+
authorisationFilter.doFilter(mockRequest, mockResponse, mockChain)
34+
35+
// Assert
36+
verify(mockChain, times(1)).doFilter(mockRequest, mockResponse)
37+
}
38+
39+
@Test
40+
fun `generates error when consumer is unauthorised for requested path`() {
41+
val mockRequest = mock(HttpServletRequest::class.java)
42+
whenever(mockRequest.requestURI).thenReturn(examplePath)
43+
whenever(mockRequest.getAttribute("clientName")).thenReturn(exampleConsumer)
44+
val mockResponse = mock(HttpServletResponse::class.java)
45+
val mockChain = mock(FilterChain::class.java)
46+
47+
authorisationConfig.consumers = mapOf(exampleConsumer to ConsumerConfig(include = emptyList(), filters = ConsumerFilters(emptyMap())))
48+
49+
val authorisationFilter = AuthorisationFilter(authorisationConfig)
50+
51+
// Act
52+
authorisationFilter.doFilter(mockRequest, mockResponse, mockChain)
53+
54+
// Assert
55+
verify(mockResponse, times(1)).sendError(403, "Unable to authorise /v1/persons for consumer-name")
56+
}
57+
58+
@Test
59+
fun `generates error when subject distinguished name is null in the request`() {
60+
val mockRequest = mock(HttpServletRequest::class.java)
61+
whenever(mockRequest.requestURI).thenReturn(examplePath)
62+
whenever(mockRequest.getAttribute("clientName")).thenReturn(null)
63+
val mockResponse = mock(HttpServletResponse::class.java)
64+
val mockChain = mock(FilterChain::class.java)
65+
66+
authorisationFilter.doFilter(mockRequest, mockResponse, mockChain)
67+
68+
verify(mockResponse, times(1)).sendError(403, "No subject-distinguished-name header provided for authorisation")
69+
}
70+
}

0 commit comments

Comments
 (0)