Spring Security test session timeout












0















I am trying to write some tests for a practice project with spring security and I am using MockMvc and related classes to do so.



So my basic configuration looks like this:



@Autowired
private WebApplicationContext context;

private MockMvc mvc;

@Before
public void setup() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
}


With tests similar to this one:



@Test
public void handleUserJSONRequest_shouldReturn401_withoutLoggedInUser() throws Exception{
ResultActions action = mvc.perform(get("/userAsJSON"));

int status = action.andReturn().getResponse().getStatus();
assertTrue("expected status code = 401 ; current status code = " + status, status == 401);
}


What I still fail to achieve is to write a test to verify that my custom session-timeout is working.



I tried the following:



@Test
public void sessionTimeoutShouldInvalidateSession_withLoggedInUser() throws Exception{
ResultActions action = mvc.perform(get("/userAsJSON").with(user("user")));
MockHttpSession session = (MockHttpSession) action.andReturn().getRequest().getSession();

TimeUnit.SECONDS.sleep(20);

ResultActions action2 = mvc.perform(get("/userAsJSON").session(session));
int status2 = action2.andReturn().getResponse().getStatus();

assertTrue("expected status code = 401 ; current status code = " + status2, status2 == 401);
}


But it will still return 200 (session timeout is set to 10 for testing purposes and can be verified to be working via curl); so I assume that has something to do with how MockMvc and MockHttpSession work.



Is there a way I can still test my session-timeout's functionality?



EDIT: On request -> my configuration:



@Override
protected void configure(HttpSecurity http) throws Exception
{
http.sessionManagement()
//number of concurrent sessions allowed for the same user
.maximumSessions(1)
.and()
.sessionFixation()
.migrateSession();
http.addFilterBefore(authenticationFilter(), BasicAuthenticationFilter.class)
.csrf().disable()
.httpBasic().disable()
.exceptionHandling()
.authenticationEntryPoint(myRestAuthenticationEntryPoint)
.and()
.authorizeRequests()
.antMatchers("/secured")
.hasRole("ADMIN")
.antMatchers("/userAsJSON")
.authenticated()
.antMatchers("/unsecured")
.permitAll()
.antMatchers("/login")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessHandler(this::handleLogoutSuccess)
.invalidateHttpSession(true);
}


with:



public void handleLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication){
response.setStatus(HttpServletResponse.SC_OK);
}


and:



@Component
public class MyRestAuthenticationEntryPoint
implements AuthenticationEntryPoint {

@Override
public void commence(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException authException) throws IOException {

response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" );
}
}









share|improve this question

























  • Could you please provide you spring-security configuration

    – borino
    Nov 14 '18 at 5:16











  • Sorry for the late reply, unexpected vacation. Is that all you need?

    – Wolfone
    Nov 28 '18 at 9:58
















0















I am trying to write some tests for a practice project with spring security and I am using MockMvc and related classes to do so.



So my basic configuration looks like this:



@Autowired
private WebApplicationContext context;

private MockMvc mvc;

@Before
public void setup() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
}


With tests similar to this one:



@Test
public void handleUserJSONRequest_shouldReturn401_withoutLoggedInUser() throws Exception{
ResultActions action = mvc.perform(get("/userAsJSON"));

int status = action.andReturn().getResponse().getStatus();
assertTrue("expected status code = 401 ; current status code = " + status, status == 401);
}


What I still fail to achieve is to write a test to verify that my custom session-timeout is working.



I tried the following:



@Test
public void sessionTimeoutShouldInvalidateSession_withLoggedInUser() throws Exception{
ResultActions action = mvc.perform(get("/userAsJSON").with(user("user")));
MockHttpSession session = (MockHttpSession) action.andReturn().getRequest().getSession();

TimeUnit.SECONDS.sleep(20);

ResultActions action2 = mvc.perform(get("/userAsJSON").session(session));
int status2 = action2.andReturn().getResponse().getStatus();

assertTrue("expected status code = 401 ; current status code = " + status2, status2 == 401);
}


But it will still return 200 (session timeout is set to 10 for testing purposes and can be verified to be working via curl); so I assume that has something to do with how MockMvc and MockHttpSession work.



Is there a way I can still test my session-timeout's functionality?



EDIT: On request -> my configuration:



@Override
protected void configure(HttpSecurity http) throws Exception
{
http.sessionManagement()
//number of concurrent sessions allowed for the same user
.maximumSessions(1)
.and()
.sessionFixation()
.migrateSession();
http.addFilterBefore(authenticationFilter(), BasicAuthenticationFilter.class)
.csrf().disable()
.httpBasic().disable()
.exceptionHandling()
.authenticationEntryPoint(myRestAuthenticationEntryPoint)
.and()
.authorizeRequests()
.antMatchers("/secured")
.hasRole("ADMIN")
.antMatchers("/userAsJSON")
.authenticated()
.antMatchers("/unsecured")
.permitAll()
.antMatchers("/login")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessHandler(this::handleLogoutSuccess)
.invalidateHttpSession(true);
}


with:



public void handleLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication){
response.setStatus(HttpServletResponse.SC_OK);
}


and:



@Component
public class MyRestAuthenticationEntryPoint
implements AuthenticationEntryPoint {

@Override
public void commence(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException authException) throws IOException {

response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" );
}
}









share|improve this question

























  • Could you please provide you spring-security configuration

    – borino
    Nov 14 '18 at 5:16











  • Sorry for the late reply, unexpected vacation. Is that all you need?

    – Wolfone
    Nov 28 '18 at 9:58














0












0








0








I am trying to write some tests for a practice project with spring security and I am using MockMvc and related classes to do so.



So my basic configuration looks like this:



@Autowired
private WebApplicationContext context;

private MockMvc mvc;

@Before
public void setup() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
}


With tests similar to this one:



@Test
public void handleUserJSONRequest_shouldReturn401_withoutLoggedInUser() throws Exception{
ResultActions action = mvc.perform(get("/userAsJSON"));

int status = action.andReturn().getResponse().getStatus();
assertTrue("expected status code = 401 ; current status code = " + status, status == 401);
}


What I still fail to achieve is to write a test to verify that my custom session-timeout is working.



I tried the following:



@Test
public void sessionTimeoutShouldInvalidateSession_withLoggedInUser() throws Exception{
ResultActions action = mvc.perform(get("/userAsJSON").with(user("user")));
MockHttpSession session = (MockHttpSession) action.andReturn().getRequest().getSession();

TimeUnit.SECONDS.sleep(20);

ResultActions action2 = mvc.perform(get("/userAsJSON").session(session));
int status2 = action2.andReturn().getResponse().getStatus();

assertTrue("expected status code = 401 ; current status code = " + status2, status2 == 401);
}


But it will still return 200 (session timeout is set to 10 for testing purposes and can be verified to be working via curl); so I assume that has something to do with how MockMvc and MockHttpSession work.



Is there a way I can still test my session-timeout's functionality?



EDIT: On request -> my configuration:



@Override
protected void configure(HttpSecurity http) throws Exception
{
http.sessionManagement()
//number of concurrent sessions allowed for the same user
.maximumSessions(1)
.and()
.sessionFixation()
.migrateSession();
http.addFilterBefore(authenticationFilter(), BasicAuthenticationFilter.class)
.csrf().disable()
.httpBasic().disable()
.exceptionHandling()
.authenticationEntryPoint(myRestAuthenticationEntryPoint)
.and()
.authorizeRequests()
.antMatchers("/secured")
.hasRole("ADMIN")
.antMatchers("/userAsJSON")
.authenticated()
.antMatchers("/unsecured")
.permitAll()
.antMatchers("/login")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessHandler(this::handleLogoutSuccess)
.invalidateHttpSession(true);
}


with:



public void handleLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication){
response.setStatus(HttpServletResponse.SC_OK);
}


and:



@Component
public class MyRestAuthenticationEntryPoint
implements AuthenticationEntryPoint {

@Override
public void commence(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException authException) throws IOException {

response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" );
}
}









share|improve this question
















I am trying to write some tests for a practice project with spring security and I am using MockMvc and related classes to do so.



So my basic configuration looks like this:



@Autowired
private WebApplicationContext context;

private MockMvc mvc;

@Before
public void setup() {
mvc = MockMvcBuilders
.webAppContextSetup(context)
.apply(springSecurity())
.build();
}


With tests similar to this one:



@Test
public void handleUserJSONRequest_shouldReturn401_withoutLoggedInUser() throws Exception{
ResultActions action = mvc.perform(get("/userAsJSON"));

int status = action.andReturn().getResponse().getStatus();
assertTrue("expected status code = 401 ; current status code = " + status, status == 401);
}


What I still fail to achieve is to write a test to verify that my custom session-timeout is working.



I tried the following:



@Test
public void sessionTimeoutShouldInvalidateSession_withLoggedInUser() throws Exception{
ResultActions action = mvc.perform(get("/userAsJSON").with(user("user")));
MockHttpSession session = (MockHttpSession) action.andReturn().getRequest().getSession();

TimeUnit.SECONDS.sleep(20);

ResultActions action2 = mvc.perform(get("/userAsJSON").session(session));
int status2 = action2.andReturn().getResponse().getStatus();

assertTrue("expected status code = 401 ; current status code = " + status2, status2 == 401);
}


But it will still return 200 (session timeout is set to 10 for testing purposes and can be verified to be working via curl); so I assume that has something to do with how MockMvc and MockHttpSession work.



Is there a way I can still test my session-timeout's functionality?



EDIT: On request -> my configuration:



@Override
protected void configure(HttpSecurity http) throws Exception
{
http.sessionManagement()
//number of concurrent sessions allowed for the same user
.maximumSessions(1)
.and()
.sessionFixation()
.migrateSession();
http.addFilterBefore(authenticationFilter(), BasicAuthenticationFilter.class)
.csrf().disable()
.httpBasic().disable()
.exceptionHandling()
.authenticationEntryPoint(myRestAuthenticationEntryPoint)
.and()
.authorizeRequests()
.antMatchers("/secured")
.hasRole("ADMIN")
.antMatchers("/userAsJSON")
.authenticated()
.antMatchers("/unsecured")
.permitAll()
.antMatchers("/login")
.permitAll()
.and()
.logout()
.logoutUrl("/logout")
.logoutSuccessHandler(this::handleLogoutSuccess)
.invalidateHttpSession(true);
}


with:



public void handleLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication){
response.setStatus(HttpServletResponse.SC_OK);
}


and:



@Component
public class MyRestAuthenticationEntryPoint
implements AuthenticationEntryPoint {

@Override
public void commence(
HttpServletRequest request,
HttpServletResponse response,
AuthenticationException authException) throws IOException {

response.sendError( HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized" );
}
}






spring spring-security spring-test






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Nov 28 '18 at 9:57







Wolfone

















asked Nov 13 '18 at 16:40









WolfoneWolfone

399412




399412













  • Could you please provide you spring-security configuration

    – borino
    Nov 14 '18 at 5:16











  • Sorry for the late reply, unexpected vacation. Is that all you need?

    – Wolfone
    Nov 28 '18 at 9:58



















  • Could you please provide you spring-security configuration

    – borino
    Nov 14 '18 at 5:16











  • Sorry for the late reply, unexpected vacation. Is that all you need?

    – Wolfone
    Nov 28 '18 at 9:58

















Could you please provide you spring-security configuration

– borino
Nov 14 '18 at 5:16





Could you please provide you spring-security configuration

– borino
Nov 14 '18 at 5:16













Sorry for the late reply, unexpected vacation. Is that all you need?

– Wolfone
Nov 28 '18 at 9:58





Sorry for the late reply, unexpected vacation. Is that all you need?

– Wolfone
Nov 28 '18 at 9:58












0






active

oldest

votes











Your Answer






StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");

StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);

StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});

function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});


}
});














draft saved

draft discarded


















StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53285666%2fspring-security-test-session-timeout%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown

























0






active

oldest

votes








0






active

oldest

votes









active

oldest

votes






active

oldest

votes
















draft saved

draft discarded




















































Thanks for contributing an answer to Stack Overflow!


  • Please be sure to answer the question. Provide details and share your research!

But avoid



  • Asking for help, clarification, or responding to other answers.

  • Making statements based on opinion; back them up with references or personal experience.


To learn more, see our tips on writing great answers.




draft saved


draft discarded














StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53285666%2fspring-security-test-session-timeout%23new-answer', 'question_page');
}
);

Post as a guest















Required, but never shown





















































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown

































Required, but never shown














Required, but never shown












Required, but never shown







Required, but never shown







Popular posts from this blog

Xamarin.iOS Cant Deploy on Iphone

Glorious Revolution

Dulmage-Mendelsohn matrix decomposition in Python