Spring Security:如何使用注销链接而不是按钮

在这篇简短的文章中,我将与您分享如何在 Spring 引导应用程序中实现注销链接,而不是默认情况下 Spring 安全性所需的按钮。原因是超链接比按钮更容易与用户界面混合。通常,在使用Spring Security时,我们需要在视图页面(使用Thymeleaf)中创建一个表单,只是为了具有这样的注销按钮:当启用CSRF时(默认),Spring Security要求/logout请求必须在HTTP POST中,以便它可以在表单中生成CSRF令牌,以防止跨站点请求伪造攻击。查看页面的源代码,您可以看到隐藏的输入插入到表单中,如下所示:您可以将 Spring 安全性配置为禁用 CSRF,以便使用超链接进行注销(然后可以使用 HTTP GET 方法发送注销请求)。例如:但是,不建议禁用 CSRF,否则会使您的应用程序面临 CSRF 攻击的风险。那么,如何在启用 CSRF 的情况下使用注销超链接呢?我将与您分享一些技巧。首先,让我们隐藏注销表单并给它一个ID:然后你可以创建一个注销超链接,如下所示:然后用户点击注销链接,将执行Javascript语句,该语句将表单提交到服务器 - 注销请求使用HTTP POST方法发送。太棒了,对吧?如果您不想在用户将鼠标悬停在 Logout 链接上时公开 Javascript 语句,您可以像这样修改链接:

1
2
3
<form th:action="@{/logout}" method="post">
    <input type="submit" value="Logout" />
form>

1
2
3
4
<form action="/MyApp/logout" method="post">
    <input type="hidden" name="_csrf" value="07b8ec05-fe21-4819-80b1-2ad57ae9450e"/>
    <input type="submit" value="Logout" />
form>

1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            ....
            .and()
            .csrf().disable()
            ....
    }  
}

1
2
3
<form th:action="@{/logout}" method="post" th:hidden="true" name="logoutForm">
    <input type="submit" value="Logout" />
form>

1
<a href="javascript: document.logoutForm.submit()">Logouta>

1
<a id="logoutLink" href="/">Logouta>
 

然后用一点jQuery代码来处理超链接的点击事件,如下所示:就是这样!现在您有一个注销链接,可以与您自己的用户界面混合。若要查看代码的实际应用,请观看以下视频:

1
2
3
4
5
6
$(document).ready(function() {
    $("#logoutLink").on("click", function(e) {
        e.preventDefault();
        document.logoutForm.submit();
    });
});

你可能感兴趣的:(spring)