Mock @AuthenticationPrincipal argument
up vote
1
down vote
favorite
I have spring-security-oauth2 application which is a ResourceServer. We have a custom PrincipalExtractor
class that builds the custom Principal object. This custom Principal object do not extend Principal
or UserDetails
class CustomUser
//some custom fields
class CustomPrincipalExtractor implements PrincipalExtractor
@Override
public CustomUser extractPrincipal(Map<String, Object> map)
return new CustomUser(map);
class SomeController
@GetMapping
public ResponseEntity(@AuthenticationPrincipal CustomUser user)
//able to get user object
The above code works fine. Now I want to test the controller, but not able to pass CustomUser instance.
@SpringBootTest
@AutoConfigureMockMvc
public class SomeControllerTest
@Autowired
private MockMvc mockMvc;
@Test
public void test()
mockMvc.perform(get(...).principal(CANNOT pass CustomUser as it does not implement Principal))
I looked at some other solutions which asks to have custom HandlerMethodArgumentResolver
but not sure how configure autoconfigured MockMvc
java spring spring-boot spring-security spring-security-oauth2
add a comment |
up vote
1
down vote
favorite
I have spring-security-oauth2 application which is a ResourceServer. We have a custom PrincipalExtractor
class that builds the custom Principal object. This custom Principal object do not extend Principal
or UserDetails
class CustomUser
//some custom fields
class CustomPrincipalExtractor implements PrincipalExtractor
@Override
public CustomUser extractPrincipal(Map<String, Object> map)
return new CustomUser(map);
class SomeController
@GetMapping
public ResponseEntity(@AuthenticationPrincipal CustomUser user)
//able to get user object
The above code works fine. Now I want to test the controller, but not able to pass CustomUser instance.
@SpringBootTest
@AutoConfigureMockMvc
public class SomeControllerTest
@Autowired
private MockMvc mockMvc;
@Test
public void test()
mockMvc.perform(get(...).principal(CANNOT pass CustomUser as it does not implement Principal))
I looked at some other solutions which asks to have custom HandlerMethodArgumentResolver
but not sure how configure autoconfigured MockMvc
java spring spring-boot spring-security spring-security-oauth2
add a comment |
up vote
1
down vote
favorite
up vote
1
down vote
favorite
I have spring-security-oauth2 application which is a ResourceServer. We have a custom PrincipalExtractor
class that builds the custom Principal object. This custom Principal object do not extend Principal
or UserDetails
class CustomUser
//some custom fields
class CustomPrincipalExtractor implements PrincipalExtractor
@Override
public CustomUser extractPrincipal(Map<String, Object> map)
return new CustomUser(map);
class SomeController
@GetMapping
public ResponseEntity(@AuthenticationPrincipal CustomUser user)
//able to get user object
The above code works fine. Now I want to test the controller, but not able to pass CustomUser instance.
@SpringBootTest
@AutoConfigureMockMvc
public class SomeControllerTest
@Autowired
private MockMvc mockMvc;
@Test
public void test()
mockMvc.perform(get(...).principal(CANNOT pass CustomUser as it does not implement Principal))
I looked at some other solutions which asks to have custom HandlerMethodArgumentResolver
but not sure how configure autoconfigured MockMvc
java spring spring-boot spring-security spring-security-oauth2
I have spring-security-oauth2 application which is a ResourceServer. We have a custom PrincipalExtractor
class that builds the custom Principal object. This custom Principal object do not extend Principal
or UserDetails
class CustomUser
//some custom fields
class CustomPrincipalExtractor implements PrincipalExtractor
@Override
public CustomUser extractPrincipal(Map<String, Object> map)
return new CustomUser(map);
class SomeController
@GetMapping
public ResponseEntity(@AuthenticationPrincipal CustomUser user)
//able to get user object
The above code works fine. Now I want to test the controller, but not able to pass CustomUser instance.
@SpringBootTest
@AutoConfigureMockMvc
public class SomeControllerTest
@Autowired
private MockMvc mockMvc;
@Test
public void test()
mockMvc.perform(get(...).principal(CANNOT pass CustomUser as it does not implement Principal))
I looked at some other solutions which asks to have custom HandlerMethodArgumentResolver
but not sure how configure autoconfigured MockMvc
java spring spring-boot spring-security spring-security-oauth2
java spring spring-boot spring-security spring-security-oauth2
edited 21 hours ago
asked Sep 5 at 8:27
sidgate
6,23353267
6,23353267
add a comment |
add a comment |
1 Answer
1
active
oldest
votes
up vote
0
down vote
accepted
I had to implement some workaround to get this work.
Created a mock Filter that sets the Authentication object in SecurityContext. Following is the code
public class MockSpringSecurityFilter implements Filter
@Override
public void init(FilterConfig filterConfig)
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
SecurityContextHolder.getContext()
.setAuthentication((Authentication) ((HttpServletRequest) req).getUserPrincipal());
chain.doFilter(req, res);
@Override
public void destroy()
SecurityContextHolder.clearContext();
Within the test
@Before
public void setup()
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity(new MockSpringSecurityFilter()))
.build();
@Test
public void test()
mockMvc.perform(get(...)
.principal(new UsernamePasswordAuthenticationToken(new CustomUser(), null))...
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
0
down vote
accepted
I had to implement some workaround to get this work.
Created a mock Filter that sets the Authentication object in SecurityContext. Following is the code
public class MockSpringSecurityFilter implements Filter
@Override
public void init(FilterConfig filterConfig)
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
SecurityContextHolder.getContext()
.setAuthentication((Authentication) ((HttpServletRequest) req).getUserPrincipal());
chain.doFilter(req, res);
@Override
public void destroy()
SecurityContextHolder.clearContext();
Within the test
@Before
public void setup()
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity(new MockSpringSecurityFilter()))
.build();
@Test
public void test()
mockMvc.perform(get(...)
.principal(new UsernamePasswordAuthenticationToken(new CustomUser(), null))...
add a comment |
up vote
0
down vote
accepted
I had to implement some workaround to get this work.
Created a mock Filter that sets the Authentication object in SecurityContext. Following is the code
public class MockSpringSecurityFilter implements Filter
@Override
public void init(FilterConfig filterConfig)
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
SecurityContextHolder.getContext()
.setAuthentication((Authentication) ((HttpServletRequest) req).getUserPrincipal());
chain.doFilter(req, res);
@Override
public void destroy()
SecurityContextHolder.clearContext();
Within the test
@Before
public void setup()
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity(new MockSpringSecurityFilter()))
.build();
@Test
public void test()
mockMvc.perform(get(...)
.principal(new UsernamePasswordAuthenticationToken(new CustomUser(), null))...
add a comment |
up vote
0
down vote
accepted
up vote
0
down vote
accepted
I had to implement some workaround to get this work.
Created a mock Filter that sets the Authentication object in SecurityContext. Following is the code
public class MockSpringSecurityFilter implements Filter
@Override
public void init(FilterConfig filterConfig)
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
SecurityContextHolder.getContext()
.setAuthentication((Authentication) ((HttpServletRequest) req).getUserPrincipal());
chain.doFilter(req, res);
@Override
public void destroy()
SecurityContextHolder.clearContext();
Within the test
@Before
public void setup()
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity(new MockSpringSecurityFilter()))
.build();
@Test
public void test()
mockMvc.perform(get(...)
.principal(new UsernamePasswordAuthenticationToken(new CustomUser(), null))...
I had to implement some workaround to get this work.
Created a mock Filter that sets the Authentication object in SecurityContext. Following is the code
public class MockSpringSecurityFilter implements Filter
@Override
public void init(FilterConfig filterConfig)
@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException
SecurityContextHolder.getContext()
.setAuthentication((Authentication) ((HttpServletRequest) req).getUserPrincipal());
chain.doFilter(req, res);
@Override
public void destroy()
SecurityContextHolder.clearContext();
Within the test
@Before
public void setup()
mockMvc = MockMvcBuilders.webAppContextSetup(context)
.apply(springSecurity(new MockSpringSecurityFilter()))
.build();
@Test
public void test()
mockMvc.perform(get(...)
.principal(new UsernamePasswordAuthenticationToken(new CustomUser(), null))...
answered Oct 25 at 5:38
sidgate
6,23353267
6,23353267
add a comment |
add a comment |
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f52180555%2fmock-authenticationprincipal-argument%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password