gpt4 book ai didi

angular - 无法使用 Spring Security 5 注销

转载 作者:行者123 更新时间:2023-12-01 23:51:27 25 4
gpt4 key购买 nike

我想构建用于图书管理的管理门户(获取、添加、删除、更新图书)。所以我从登录/注销功能开始;登录部分工作起来就像一个魅力,但我面临着注销问题。当我注销时,管理门户会保持 session 处于事件状态并且不会终止它,并且我无法在日志中收到任何错误来证明此问题。

下面是响应注销发布请求的一段代码:

@RequestMapping(value = "/user/logout", method = RequestMethod.POST)
public ResponseEntity logout(HttpServletRequest request, HttpServletResponse response) {
SecurityContextHolder.clearContext();

return new ResponseEntity("Logout Successful !", HttpStatus.OK);
}

在客户端中,我使用 Angular 向本地服务器发送发布请求。在注销服务下方:

logout(){
let url="http://localhost:8090/user/logout";
const xToken = localStorage.getItem('xAuthToken');
let headers=new Headers({
'x-auth-token':xToken,
});

return this.http.post(url,{headers:headers});
}

xToken 变量从本地浏览器存储中获取 session 的 token 。

每次我们在登录组件的 ngOnInit 中检查 session 是否保持事件状态:

ngOnInit() {
this.login.checkSession().subscribe(
res=>{
this.loggedIn=true;
},
err=>{
console.log(err);
this.loggedIn=false;
}
)
}

负责 session 检查的服务详细信息如下:

checkSession(){
let url="http://localhost:8090/checkSession";
const xToken = localStorage.getItem('xAuthToken');
const basicHeader = 'Basic ' + localStorage.getItem('credentials');
let headers=new Headers({
'x-auth-token':xToken,
'Authorization':basicHeader
});

return this.http.get(url,{headers:headers});
}

为了检查 session ,我们请求服务器:

@RequestMapping("/checkSession")
public ResponseEntity checkSession() {
System.out.print("Session Active !");
return new ResponseEntity("Session Active !", HttpStatus.OK);
}

basicHeader常量是一种身份验证方案,其中包含存储在浏览器本地存储中的编码用户名/密码组合。

有关我们如何将凭据发送到服务器的更多信息:

onSubmit(){
this.login.sendCredentials(this.credentials.username,this.credentials.password).subscribe(
res=>{
console.log(res);
localStorage.setItem('xAuthToken', res.json().token);
this.loggedIn=true;
const encodedCredentials = btoa(this.credentials.username + ':' + this.credentials.password);
localStorage.setItem("credentials",encodedCredentials);
location.reload();
},err=>{
console.log(err);
}
)
}

非常感谢您的帮助。预先感谢您解决此问题

最佳答案

Spring Security 开箱即用地支持注销功能,它只需要一些配置:

@EnableWebSecurity
@Configuration
public class SecurityConf extends WebSecurityConfigurerAdapter {

@Override
public void configure(HttpSecurity http) {

http
.httpBasic().and() // HTTP Basic authorization or whichever
.authorizeRequests()
.antMatchers(...).permitAll()
.anyRequest().authenticated().and()
...
.logout();
}

...
}

然后可以通过 POST 方法在 http://localhost:8080/logout 访问 /logout 方法,假设您的应用程序启动于localhost 通过 8080 端口。

了解更多详情Spring Security doc

关于angular - 无法使用 Spring Security 5 注销,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52784756/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com