在这篇简短的文章中,我将与您分享如何在 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()" >Logout</ a >
|
1
|
< a id = "logoutLink" href = "/" >Logout</ a >
|
然后用一点jQuery代码来处理超链接的点击事件,如下所示:就是这样!现在您有一个注销链接,可以与您自己的用户界面混合。若要查看代码的实际应用,请观看以下视频:
1
2
3
4
5
6
|
$(document).ready(function() {
$("#logoutLink").on("click", function(e) {
e.preventDefault();
document.logoutForm.submit();
});
});
|