当前位置: 首页 > 知识库问答 >
问题:

如何成功注销

华俊贤
2023-03-14

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

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

我已经实现了从抽象类WebSecurity配置适配器重写的以下方法:

@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个答案

索嘉胜
2023-03-14

添加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(“/登录”)是用户将重定向到的页面。

您可以将代码重新分解为以下内容

@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);
    }
戚建华
2023-03-14

我想这可能是因为在方法“logoutUrl”和“logoutSuccessUrl”中有相同的url。

我建议您将“注销url”更改为其他路径,例如,只需“注销”,然后尝试按该url执行注销。它应该完成注销任务并重定向到logoutSuccessUrl,即欢迎

 类似资料:
  • 处理完提交无效数据的情况,本节我们要完成注册表单的功能,如果提交的数据有效,就把用户存入数据库。我们先尝试保存用户,如果保存成功,用户的数据会自动存入数据库,然后在浏览器中重定向,转向新注册用户的资料页面,页面中还会显示一个欢迎消息,构思图如图 7.19 所示。如果保存用户失败了,就交由上一节实现的功能处理。 图 7.19:注册成功后显示的页面构思图 7.4.1 完整的注册表单 要完成注册表单的功

  • 我可以成功地将用户数据发送到服务器,但是我很难从服务器获得响应(用户注册)。请查看我的代码,并告诉我,如何获得Json响应(用户注册)。我已经尝试使用布尔和字符串类型的Asynctask来获得响应。但是在这里我将字符串保持为空。请告诉我如何获得Json响应。提前感谢!!! }

  • https://alpha.app/#session_state=5AD94ADB-39F5-4664-ABC8&code=7BA2-488E-9BF4-AD7B1A969904.B3D26ED7-649A-454D-B6FF-246792277042

  • 我在spring boot应用程序中使用基于java的Spring Security配置。当用户单击注销链接时,用户将被重定向到登录页面。在这里,在这种情况下,我需要在注销成功url中传递一个自定义参数。 例如,当我注销时,应用程序被重定向到http://localhost:8080/app/login但我希望它有一个如下所示的参数http://localhost:8080/app/login?i

  • 问题内容: 我想要在spring成功注册后自动登录:我有一个受保护的页面,需要登录才能访问它们,我要在注册后跳过登录页面并进行自动登录,以便用户可以看到受保护的页面有我吗?我正在使用spring 3.0,spring security 3.0.2,该怎么做? 问题答案: 可以通过以下方式(半伪代码)通过spring安全性完成此操作: 更新:仅包含注册后如何创建会话

  • 问题内容: 阅读后:在Java中获取“外部” IP地址 码: 我以为自己是赢家,但出现以下错误 我认为这是因为服务器响应速度不够快,是否有任何方法可以确保它将获得外部ip? 编辑:好的,所以它被拒绝了,其他人知道另一个可以执行相同功能的站点 问题答案: 在运行以下代码之前,请先查看以下内容:http : //www.whatismyip.com/faq/automation.asp