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?
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
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());
}
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();
}
Essayez d'ajouter l'URL de déconnexion à votre configuration de sécurité.
.logout()
.logoutUrl("/logout")
.logoutSuccessUrl("/")
.permitAll();
Vous pouvez remplacer Post par Get http: // localhost: 9999/client/logout
ça marche pour moi