如何成功注销

时间:2018-12-18 15:44:00

标签: spring-boot spring-security logout

我的登录页面为http://localhost:8080/nradmin/welcome 我的主页(成功登录后)是http://localhost:8080/nradmin/home

我想注销,现在不再能够访问任何其他页面(例如主页),而只能访问“欢迎”(登录)页面。如果注销后在浏览器上键入http://localhost:8080/nradmin/home,则无需登录即可继续访问主页。

我已经实现了抽象类WebSecurityConfigurerAdapter覆盖的以下方法:

@Override
protected void configure(HttpSecurity http) throws Exception {       http
     .authorizeRequests()
        .antMatchers("/welcome").permitAll()
        .antMatchers("/home", "/account/**", "/price/**").hasRole("ADMIN")
        .antMatchers("/home", "/account/**", "/price/**").access("hasRole('ROLE_ADMIN')")
        .anyRequest()
        .authenticated()
        .and()
     .formLogin()
        .loginPage("/welcome")  
        .defaultSuccessUrl("/home")
        .and()
     .logout()
        .invalidateHttpSession(true)      
        .clearAuthentication(true)
        .logoutSuccessUrl("/welcome")    
        .logoutUrl("/welcome")          
        .deleteCookies()
        .permitAll()
        .and()
     .exceptionHandling()
        .accessDeniedPage("/welcome")           
        .and()
     .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);

}

@Override   
protected void configure(final AuthenticationManagerBuilder auth) throws Exception {        
auth.inMemoryAuthentication()           .withUser("username").password(passwordEncoder().encode("12345")).roles(LoginDataConstants.ROLE_ADMIN)
    }
@Bean
public PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
}

有人知道怎么做吗?

2 个答案:

答案 0 :(得分:0)

我猜可能是由于方法logoutUrllogoutSuccessUrl中的URL相同。

我建议您将logoutUrl更改为其他路径,例如仅更改/logout,然后尝试执行击中该URL的注销。它应该完成注销任务并重定向到logoutSuccessUrl

答案 1 :(得分:0)

添加CSRF

Spring文档的参考。

  

将使用URL执行注销/通过任何HTTP方法请求注销

@Override protected void configure(HttpSecurity http) throws Exception { 
http.
logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")); 
  } 
}

您也可以使用相同的方法here

引用一个有关堆栈溢出的好例子。

遇到此问题时,我使用了此行

.logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/login");

哪里

  

.logoutSuccessUrl(“ / login”)是将用户重定向到的页面。

您可以将代码重构为类似的内容

@Override
protected void configure(HttpSecurity http) throws Exception {       http
     .authorizeRequests()
        .antMatchers("/welcome").permitAll()
        .antMatchers("/home", "/account/**", "/price/**").hasRole("ADMIN")
        .antMatchers("/home", "/account/**", "/price/**").access("hasRole('ROLE_ADMIN')")
        .anyRequest()
        .authenticated()
        .and()
     .formLogin()
        .loginPage("/welcome")  
        .defaultSuccessUrl("/home")
        .and()
     .logout()
     .and() // This section is re-factored.
        .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
        .logoutSuccessUrl("/welcome").deleteCookies("JSESSIONID") //Or try .logoutSuccessUrl("/nradmin/welcome") 
        .invalidateHttpSession(true)
        .permitAll()
        .and()
     .exceptionHandling()
        .accessDeniedPage("/welcome")           
        .and()
     .sessionManagement()
        .sessio hinCreationPolicy(SessionCreationPolicy.IF_REQUIRED);

更新:这是修改后的版本。本质上,这是我在项目中使用的内容,除了以下部分:

.and()
.exceptionHandling()
.accessDeniedPage("/welcome")
.and()
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);

因此,我认为它应该起作用;否则,我认为这可能是安装问题/配置,该问题/配置位于项目的其他位置。请尝试以下示例。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
        .authorizeRequests()
        .antMatchers("/nradmin/welcome", "/home", "/account/**", "/price/**").hasRole("ADMIN")
        .anyRequest().permitAll()
        .and()
        .formLogin()
        .loginPage("/nradmin/welcome")
        .permitAll()
        .and()
        .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
        .logoutSuccessUrl("/nradmin/welcome").deleteCookies("JSESSIONID") 
        .invalidateHttpSession(true)
        .permitAll()
        .and()
        .exceptionHandling()
        .accessDeniedPage("/nradmin/welcome")
        .and()
        .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED);
    }