web-dev-qa-db-fra.com

Comment se déconnecter du client oauth2 au printemps?

J'ai le client oauth2 le plus simple:

@EnableAutoConfiguration
@Configuration
@EnableOAuth2Sso
@RestController
public class ClientApplication {

    @RequestMapping("/")
    public String home(Principal user, HttpServletRequest request, HttpServletResponse response) throws ServletException {       
        return "Hello " + user.getName();
    }

    public static void main(String[] args) {
        new SpringApplicationBuilder(ClientApplication.class)
                .properties("spring.config.name=application").run(args);
    }

}

J'ai aussi le application.yml suivant:

server:
  port: 9999
  servlet:
    context-path: /client
security:
  oauth2:
    client:
      client-id: acme
      client-secret: acmesecret
      access-token-uri: http://localhost:8080/oauth/token
      user-authorization-uri: http://localhost:8080/oauth/authorize
    resource:
      user-info-uri: http://localhost:8080/me

logging:
  level:
    org.springframework.security: DEBUG
    org.springframework.web: DEBUG

C'est le code complet. Je n'ai pas de code source supplémentaire. Cela fonctionne correctement.

Mais maintenant, je veux ajouter une fonctionnalité de déconnexion. J'ai ajouté un terminal, mais cela ne fonctionne pas. J'ai essayé de faire ce qui suit:

@RequestMapping("/logout")
    public void logout(HttpServletRequest request, HttpServletResponse response) throws ServletException {
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        authentication.setAuthenticated(false);
        new SecurityContextLogoutHandler().logout(request,response,authentication);
        SecurityContextHolder.clearContext();
        request.logout();
        request.getSession().invalidate();
    }

Mais je suis toujours connecté et je peux accéder à / url qui me répond avec le nom d'utilisateur.

Pouvez-vous m'aider à résoudre ce problème?

Mettre à jour

J'ai essayé l'approche décrite ici https://spring.io/guides/tutorials/spring-boot-oauth2/#_social_login_logout :

@EnableAutoConfiguration
@Configuration
@EnableOAuth2Sso
@Controller
public class ClientApplication extends WebSecurityConfigurerAdapter {
    private Logger logger = LoggerFactory.getLogger(ClientApplication.class);

    @RequestMapping("/hello")
    public String home(Principal user, HttpServletRequest request, HttpServletResponse response, Model model) throws ServletException {
        model.addAttribute("name", user.getName());
        return "hello";
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // @formatter:off
        http.antMatcher("/**")
                .authorizeRequests()
                .antMatchers( "/login**", "/webjars/**", "/error**").permitAll()
                .anyRequest()
                .authenticated()
                .and().logout().logoutSuccessUrl("/").permitAll()
                .and()
                    .csrf()
                    .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
        // @formatter:on
    }

    public static void main(String[] args) {
        new SpringApplicationBuilder(ClientApplication.class)
                .properties("spring.config.name=application").run(args);
    }
}

et sur FE j'ai écrit:

<script type="text/javascript">
        $.ajaxSetup({
            beforeSend: function (xhr, settings) {
                if (settings.type == 'POST' || settings.type == 'PUT'
                    || settings.type == 'DELETE') {
                    if (!(/^http:.*/.test(settings.url) || /^https:.*/
                            .test(settings.url))) {
                        // Only send the token to relative URLs i.e. locally.
                        xhr.setRequestHeader("X-XSRF-TOKEN",
                            Cookies.get('XSRF-TOKEN'));
                    }
                }
            }
        });
        var logout = function () {
            $.post("/client/logout", function () {
                $("#user").html('');
                $(".unauthenticated").show();
                $(".authenticated").hide();
            });
            return true;
        };
        $(function() {
            $("#logoutButton").on("click", function () {
                logout();
            });
        });

    </script>

et

<input type="button" id="logoutButton" value="Logout"/>

Mais ça ne marche toujours pas. Il en résulte le comportement suivant:

Post http://localhost:9999/client/logout redirige vers le http://localhost:9999/client mais cette page n'existe pas

code source sur gitub:
client - https://github.com/gredwhite/logour_social-auth-client (utilisez localhost:9999/client/hello url)
serveur - https://github.com/gredwhite/logout_social-auth-server

12
gstackoverflow

Ajoutez l’extrait de code suivant à votre classe ClientApplication. Cela effacera également les détails de votre session. 

Remplacez le code ci-dessous par la méthode de configuration de votre classe d’adaptateur de sécurité Web.

@Override
    protected void configure(HttpSecurity http) throws Exception {
        http.antMatcher("/**")
                .authorizeRequests()
                .antMatchers( "/login**", "/webjars/**", "/error**").permitAll()
                .anyRequest()
                .authenticated()
                .and().logout().invalidateHttpSession(true)
                .clearAuthentication(true).logoutSuccessUrl("/login?logout").deleteCookies("JSESSIONID").permitAll().and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
    }
1
Dharita Chokshi

Vous voudrez probablement utiliser le support intégré de Spring Security pour le noeud final/logout qui fera le bon choix (effacer la session et invalider le cookie). Pour configurer le noeud final, étendez la méthode configure () existante dans notre WebSecurityConfigurer:

@Override
protected void configure(HttpSecurity http) throws Exception {
  http.antMatcher("/**")
     .and().logout().logoutSuccessUrl("/").permitAll();
}
1
Eby Jacob

Essayez d'ajouter l'URL de déconnexion à votre configuration de sécurité.

    .logout()
        .logoutUrl("/logout")
        .logoutSuccessUrl("/")
        .permitAll();
0
Rafał Sokalski

Vous pouvez remplacer Post par Get http: // localhost: 9999/client/logout

ça marche pour moi 

0
Evan Gu