OAuth2LoginAuthenticationProvider with UserDetailsChecker to verify if user is disabled









up vote
0
down vote

favorite












My security configuration has 3 authentication providers:




  • DaoAuthenticationProvider (for username and password authentication)


  • OidcAuthorizationCodeAuthenticationProvider (for oidc clients)


  • OAuth2LoginAuthenticationProvider (for oauth2 clients)

DaoAuthenticationProvider is using simple implementation of UserDetailsService which queries the user from the database and returns org.springframework.security.core.userdetails.User object. I am also using the enabled boolean flag on the User object which is determined by database status - if the is account is disabled or not. This provider by default uses implementation of UserDetailsChecker which checks the boolean flags on the user and throws exceptions if any of them are false. Everything works perfectly.



Problem



However when I am using Oauth2 to login using Google for example, then the OAuth2LoginAuthenticationProvider by default does not use UserDetailsChecker to verify these flags. So I have injected the checker into my custom implementation of OAuth2UserService.



!! Now when the exception is thrown, then ProviderManager first handles the thrown exception and stores it as lastException, but following THIS CODE, as OAuth2LoginAuthenticationProvider has parent ProviderManager set (which is the DaoAuthenticationProvider), then the code continues executing and tries to run Oauth2 authentication via Dao provider and fails, which eventually sets the lastException to be "No AuthenticationProvider found for OAuth2LoginAuthenticationProvider" and the authentication fails.



Question



How can properly check if user found from database is disabled or not through Oauth/Oidc providers. According to the ProviderManager code this is not possible unless I make my own implementation of it and break the loop there as described in THIS old similar issue.



I am using the latest and greatest Spring Boot, Spring Security and Spring Security Oauth2 libraries.










share|improve this question

























    up vote
    0
    down vote

    favorite












    My security configuration has 3 authentication providers:




    • DaoAuthenticationProvider (for username and password authentication)


    • OidcAuthorizationCodeAuthenticationProvider (for oidc clients)


    • OAuth2LoginAuthenticationProvider (for oauth2 clients)

    DaoAuthenticationProvider is using simple implementation of UserDetailsService which queries the user from the database and returns org.springframework.security.core.userdetails.User object. I am also using the enabled boolean flag on the User object which is determined by database status - if the is account is disabled or not. This provider by default uses implementation of UserDetailsChecker which checks the boolean flags on the user and throws exceptions if any of them are false. Everything works perfectly.



    Problem



    However when I am using Oauth2 to login using Google for example, then the OAuth2LoginAuthenticationProvider by default does not use UserDetailsChecker to verify these flags. So I have injected the checker into my custom implementation of OAuth2UserService.



    !! Now when the exception is thrown, then ProviderManager first handles the thrown exception and stores it as lastException, but following THIS CODE, as OAuth2LoginAuthenticationProvider has parent ProviderManager set (which is the DaoAuthenticationProvider), then the code continues executing and tries to run Oauth2 authentication via Dao provider and fails, which eventually sets the lastException to be "No AuthenticationProvider found for OAuth2LoginAuthenticationProvider" and the authentication fails.



    Question



    How can properly check if user found from database is disabled or not through Oauth/Oidc providers. According to the ProviderManager code this is not possible unless I make my own implementation of it and break the loop there as described in THIS old similar issue.



    I am using the latest and greatest Spring Boot, Spring Security and Spring Security Oauth2 libraries.










    share|improve this question























      up vote
      0
      down vote

      favorite









      up vote
      0
      down vote

      favorite











      My security configuration has 3 authentication providers:




      • DaoAuthenticationProvider (for username and password authentication)


      • OidcAuthorizationCodeAuthenticationProvider (for oidc clients)


      • OAuth2LoginAuthenticationProvider (for oauth2 clients)

      DaoAuthenticationProvider is using simple implementation of UserDetailsService which queries the user from the database and returns org.springframework.security.core.userdetails.User object. I am also using the enabled boolean flag on the User object which is determined by database status - if the is account is disabled or not. This provider by default uses implementation of UserDetailsChecker which checks the boolean flags on the user and throws exceptions if any of them are false. Everything works perfectly.



      Problem



      However when I am using Oauth2 to login using Google for example, then the OAuth2LoginAuthenticationProvider by default does not use UserDetailsChecker to verify these flags. So I have injected the checker into my custom implementation of OAuth2UserService.



      !! Now when the exception is thrown, then ProviderManager first handles the thrown exception and stores it as lastException, but following THIS CODE, as OAuth2LoginAuthenticationProvider has parent ProviderManager set (which is the DaoAuthenticationProvider), then the code continues executing and tries to run Oauth2 authentication via Dao provider and fails, which eventually sets the lastException to be "No AuthenticationProvider found for OAuth2LoginAuthenticationProvider" and the authentication fails.



      Question



      How can properly check if user found from database is disabled or not through Oauth/Oidc providers. According to the ProviderManager code this is not possible unless I make my own implementation of it and break the loop there as described in THIS old similar issue.



      I am using the latest and greatest Spring Boot, Spring Security and Spring Security Oauth2 libraries.










      share|improve this question













      My security configuration has 3 authentication providers:




      • DaoAuthenticationProvider (for username and password authentication)


      • OidcAuthorizationCodeAuthenticationProvider (for oidc clients)


      • OAuth2LoginAuthenticationProvider (for oauth2 clients)

      DaoAuthenticationProvider is using simple implementation of UserDetailsService which queries the user from the database and returns org.springframework.security.core.userdetails.User object. I am also using the enabled boolean flag on the User object which is determined by database status - if the is account is disabled or not. This provider by default uses implementation of UserDetailsChecker which checks the boolean flags on the user and throws exceptions if any of them are false. Everything works perfectly.



      Problem



      However when I am using Oauth2 to login using Google for example, then the OAuth2LoginAuthenticationProvider by default does not use UserDetailsChecker to verify these flags. So I have injected the checker into my custom implementation of OAuth2UserService.



      !! Now when the exception is thrown, then ProviderManager first handles the thrown exception and stores it as lastException, but following THIS CODE, as OAuth2LoginAuthenticationProvider has parent ProviderManager set (which is the DaoAuthenticationProvider), then the code continues executing and tries to run Oauth2 authentication via Dao provider and fails, which eventually sets the lastException to be "No AuthenticationProvider found for OAuth2LoginAuthenticationProvider" and the authentication fails.



      Question



      How can properly check if user found from database is disabled or not through Oauth/Oidc providers. According to the ProviderManager code this is not possible unless I make my own implementation of it and break the loop there as described in THIS old similar issue.



      I am using the latest and greatest Spring Boot, Spring Security and Spring Security Oauth2 libraries.







      spring spring-security oauth-2.0






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 9 at 20:53









      Vaelyr

      1,4581820




      1,4581820



























          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',
          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%2f53233134%2foauth2loginauthenticationprovider-with-userdetailschecker-to-verify-if-user-is-d%23new-answer', 'question_page');

          );

          Post as a guest















          Required, but never shown






























          active

          oldest

          votes













          active

          oldest

          votes









          active

          oldest

          votes






          active

          oldest

          votes















           

          draft saved


          draft discarded















































           


          draft saved


          draft discarded














          StackExchange.ready(
          function ()
          StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53233134%2foauth2loginauthenticationprovider-with-userdetailschecker-to-verify-if-user-is-d%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

          How to how show current date and time by default on contact form 7 in WordPress without taking input from user in datetimepicker

          Syphilis

          Darth Vader #20