Skip to content

Commit bd32aac

Browse files
committed
remote authority check on refresh token endpoint
1 parent c9363b9 commit bd32aac

File tree

4 files changed

+45
-14
lines changed

4 files changed

+45
-14
lines changed

src/main/java/com/bfwg/rest/AuthenticationController.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import org.springframework.beans.factory.annotation.Value;
77
import org.springframework.http.MediaType;
88
import org.springframework.http.ResponseEntity;
9-
import org.springframework.security.access.prepost.PreAuthorize;
109
import org.springframework.web.bind.annotation.RequestMapping;
1110
import org.springframework.web.bind.annotation.RequestMethod;
1211
import org.springframework.web.bind.annotation.RestController;
@@ -33,7 +32,6 @@ public class AuthenticationController {
3332
private String TOKEN_COOKIE;
3433

3534
@RequestMapping(value = "/refresh", method = RequestMethod.GET)
36-
@PreAuthorize("hasRole('USER')")
3735
public ResponseEntity<?> refreshAuthenticationToken(HttpServletRequest request, HttpServletResponse response) {
3836

3937
String authToken = tokenHelper.getToken( request );

src/main/java/com/bfwg/security/auth/TokenAuthenticationFilter.java

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,15 @@ public void doFilterInternal(HttpServletRequest request, HttpServletResponse res
4444
} catch (IllegalArgumentException e) {
4545
logger.error("an error occured during getting username from token", e);
4646
}
47-
// get user
48-
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
49-
// create authentication
50-
TokenBasedAuthentication authentication = new TokenBasedAuthentication(userDetails);
51-
authentication.setToken(authToken);
52-
SecurityContextHolder.getContext().setAuthentication(authentication);
47+
48+
if (username != null) {
49+
// get user
50+
UserDetails userDetails = userDetailsService.loadUserByUsername(username);
51+
// create authentication
52+
TokenBasedAuthentication authentication = new TokenBasedAuthentication(userDetails);
53+
authentication.setToken(authToken);
54+
SecurityContextHolder.getContext().setAuthentication(authentication);
55+
}
5356
}
5457

5558
chain.doFilter(request, response);

src/main/resources/application.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ app:
33

44
jwt:
55
header: Authorization
6-
expires_in: 600 # 10 minutes
6+
expires_in: 6 # 10 minutes
77
secret: queenvictoria
88
cookie: AUTH-TOKEN
99

src/test/java/com/bfwg/rest/AuthenticationControllerTest.java

Lines changed: 35 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,25 @@
11
package com.bfwg.rest;
22

3+
import com.bfwg.model.User;
4+
import com.bfwg.security.TokenHelper;
5+
import com.bfwg.security.UserDetailsDummy;
6+
import io.jsonwebtoken.ExpiredJwtException;
7+
import org.joda.time.DateTimeUtils;
38
import org.junit.Before;
49
import org.junit.Test;
510
import org.junit.runner.RunWith;
611
import org.springframework.beans.factory.annotation.Autowired;
712
import org.springframework.boot.test.context.SpringBootTest;
8-
import org.springframework.security.test.context.support.WithAnonymousUser;
13+
import org.springframework.boot.test.mock.mockito.MockBean;
14+
import org.springframework.security.core.userdetails.UserDetailsService;
915
import org.springframework.test.context.junit4.SpringRunner;
1016
import org.springframework.test.web.servlet.MockMvc;
17+
import org.springframework.test.web.servlet.ResultActions;
1118
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
1219
import org.springframework.web.context.WebApplicationContext;
1320

21+
import static org.mockito.Matchers.eq;
22+
import static org.mockito.Mockito.when;
1423
import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity;
1524
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
1625
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
@@ -24,6 +33,12 @@ public class AuthenticationControllerTest {
2433

2534
private MockMvc mvc;
2635

36+
@Autowired
37+
private TokenHelper tokenHelper;
38+
39+
@MockBean
40+
private UserDetailsService userDetailsService;
41+
2742
@Autowired
2843
private WebApplicationContext context;
2944

@@ -33,15 +48,30 @@ public void setup() {
3348
.webAppContextSetup(context)
3449
.apply(springSecurity())
3550
.build();
51+
52+
DateTimeUtils.setCurrentMillisSystem();
53+
User user = new User();
54+
user.setUsername("username");
55+
when(this.userDetailsService.loadUserByUsername(eq("test-user"))).thenReturn(user);
3656
}
3757

3858

3959
@Test
40-
@WithAnonymousUser
41-
public void shouldGetUnauthorizedWithAnonymousUser() throws Exception {
42-
this.mvc.perform(get("/auth/refresh"))
43-
.andExpect(status().isUnauthorized());
60+
public void shouldGet200WhenGivenValidOldToken() throws Exception {
61+
62+
String token = tokenHelper.generateToken(new UserDetailsDummy("test-user").getUsername());
63+
this.mvc.perform(get("/auth/refresh").header("Authorization", "Bearer " + token))
64+
.andExpect(status().is(200));
65+
66+
}
4467

68+
@Test(expected = ExpiredJwtException.class)
69+
public void shouldNotGet200WhenGivenInvalidOldToken() throws Exception {
70+
DateTimeUtils.setCurrentMillisFixed(1L); // set time back to 1970
71+
String token = tokenHelper.generateToken(new UserDetailsDummy("test-user").getUsername());
72+
DateTimeUtils.setCurrentMillisSystem(); // back to now
73+
ResultActions action = null;
74+
this.mvc.perform(get("/auth/refresh").header("Authorization", "Bearer " + token));
4575
}
4676

4777
}

0 commit comments

Comments
 (0)