为了账号安全,请及时绑定邮箱和手机立即绑定

与 Spring 和 Thymeleaf 的注销链接;发布错误

与 Spring 和 Thymeleaf 的注销链接;发布错误

肥皂起泡泡 2021-11-24 18:27:33
以下问题:我用 Spring 创建了一个简单的注销:    <form th:action="@{/logout-custom}" method="POST" name="logoutForm"     id="logout">        <input type="submit"/>    </form>   安全:@Overrideprotected void configure(HttpSecurity http) throws Exception {    http        .authorizeRequests()            .antMatchers("/cont/**").access("hasRole('USER')")            .and()            .formLogin()            .loginPage("/login")            .defaultSuccessUrl("/login-success", true)            .failureUrl("/failLogin.html")            .permitAll()            .and()            .logout().logoutUrl("/logout").permitAll()        .and()        .csrf()        .disable();}    控制器://Logout@RequestMapping(value="/logout-custom", method = RequestMethod.POST)public RedirectView logoutPage (HttpServletRequest request, HttpServletResponse response) {    Authentication auth = SecurityContextHolder.getContext().getAuthentication();    if (auth != null){        new SecurityContextLogoutHandler().logout(request, response, auth);    }    return new RedirectView("/loginForm.html");}   // redirecting to login Page依赖项:               <dependency>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-starter-actuator</artifactId>            </dependency>            <dependency>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-starter-web</artifactId>            </dependency>            <dependency>                <groupId>org.springframework.boot</groupId>                <artifactId>spring-boot-starter-security</artifactId>            </dependency>    <dependency>        <groupId>org.apache.tomcat.embed</groupId>        <artifactId>tomcat-embed-jasper</artifactId>        <scope>provided</scope>    </dependency>当我单击注销按钮时,它显示“不支持请求方法‘POST’”错误。使用 GET 方法,它只是添加了一个“?” 在我的 url 后面签名既不显示错误也不重定向。我从我的 html 中删除了所有内容,除了表单,因为似乎有些脚本阻止了整个事情(这是后来的问题)。我还尝试删除控制器并仅使用 logout().logoutUrl().logoutSuccessUrl() 但这也不起作用。
查看完整描述

3 回答

?
当年话下

TA贡献1890条经验 获得超9个赞

在SecurityContextLogoutHandler默认情况下添加,所以你并不需要实现自定义注销它。


如果你想添加其他LogoutHandler你可以在你的配置中做到:


@Override

protected void configure(HttpSecurity http) throws Exception {

    http

        .authorizeRequests()

            .antMatchers("/cont/**").access("hasRole('USER')")

            .and()


            .formLogin()

            .loginPage("/login")

            .defaultSuccessUrl("/login-success", true)

            .failureUrl("/failLogin.html")

            .permitAll()


            .and()

            .logout().logoutUrl("/logout-custom")

            .logoutSuccessUrl("/login")

            .addLogoutHandler(new CustomLogoutHandler())

            .permitAll()


        .and()

        .csrf()

        .disable();

}

logoutSuccessUrl("/login")成功注销后,将用户重定向到登录。


更新:另外删除 th: 并使用纯 HTML 可以解决问题。


查看完整回答
反对 回复 2021-11-24
?
阿晨1998

TA贡献2037条经验 获得超6个赞

自从我使用 spring 和 thymeleaf 已经有一段时间了,但我认为 RedirectView 必须指向一个 url。我自己试过你的例子,它确实没有用。然而,一些细微的变化使它起作用:


如果您的控制器中尚不存在 url 以登录:


@GetMapping("/loginForm")

public String loginForm() {

    return "loginForm";

}

更改您的重定向视图:


return new RedirectView("/loginForm");

这是资源结构:


resources

  -> templates

    -> loginForm.html

    -> logout.html


查看完整回答
反对 回复 2021-11-24
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

为什么使用 .logout().logoutUrl("/logout").permitAll()


同时,使用@RequestMapping(value="/logout-custom", method = RequestMethod.POST),它们应该是相同的 URL


或者让它变得简单


<form th:action="@{/logout}" method="post">

         <button type="submit">Sign Out</button>        

 </form>

并在安全配置上使用。


   .logout().permitAll();

默认情况下,注销功能已经存在。


查看完整回答
反对 回复 2021-11-24
  • 3 回答
  • 0 关注
  • 112 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信