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










share|improve this question



























    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










    share|improve this question

























      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










      share|improve this question















      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






      share|improve this question















      share|improve this question













      share|improve this question




      share|improve this question








      edited 21 hours ago

























      asked Sep 5 at 8:27









      sidgate

      6,23353267




      6,23353267






















          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))...






          share|improve this answer




















            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',
            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%2f52180555%2fmock-authenticationprincipal-argument%23new-answer', 'question_page');

            );

            Post as a guest






























            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))...






            share|improve this answer
























              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))...






              share|improve this answer






















                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))...






                share|improve this answer












                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))...







                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Oct 25 at 5:38









                sidgate

                6,23353267




                6,23353267



























                     

                    draft saved


                    draft discarded















































                     


                    draft saved


                    draft discarded














                    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














































































                    這個網誌中的熱門文章

                    How to combine Bézier curves to a surface?

                    Mutual Information Always Non-negative

                    Why am i infinitely getting the same tweet with the Twitter Search API?