Как успешно выйти из системы - PullRequest
0 голосов
/ 18 декабря 2018

Моя страница входа - 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 голосов
/ 20 декабря 2018

Добавить CSRF

Ссылка из документов Spring.

Будет выполнен выход с URL-адресом / выход из системы запрашивается любым методом HTTP

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

Вы можете также сослаться на хороший пример переполнения стека, используя тот же метод здесь

Когда у меня возникла эта проблема, я использовал эту строку

.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);
    }
0 голосов
/ 20 декабря 2018

Я думаю, это может быть связано с тем, что в методах logoutUrl и logoutSuccessUrl используется один и тот же URL.

Я предлагаю вам изменить logoutUrl на другой путь, например, просто /logout, а затем попытаться выполнить выход из системы, нажав этот URL.Он должен завершить задачу выхода из системы и перенаправить на logoutSuccessUrl, то есть /welcome

...