我有一个前置应用程序(角度)。对于身份验证部分,我使用spring安全性oauth。我还使用JWT令牌。 所有的身份验证表单(创建帐户,登录,更改密码...)都在Spring端处理。
如果我在登录时重新启动身份验证服务器,然后在前端应用程序上导航,那么由于我的JWT不会过期,一切仍然可以正常工作。
我有一个WS可以访问“更改密码”表格。该WS需要身份验证:
.antMatchers("/user/updatePassword").authenticated()
如果我在身份验证服务器重新启动后立即立即调用“ / user / updatePassword” WS,则不再认为我已通过身份验证,然后将我重定向到登录表单->这样就可以了
但是,如果我执行这种情况:
登录后重新启动身份验证服务器
在Angular上导航一下->一些令牌有效性请求发送到身份验证服务器。
身份验证服务器将Authentication.isAuthenticated()设置为true(因为令牌仍然有效)。
尝试调用“ / user / updatePassword”以显示“更改密码”表单
此时
SecurityContextHolder.getContext().getAuthentication().isAuthenticated()
==真
但是
SecurityContextHolder.getContext().getAuthentication().getPrincipal()
包含一个User对象,但其中只包含空值,因此我无法识别当前用户,也无法检查旧密码的有效性。
我必须在某处错过某些东西,但是我找不到什么地方?也许我应该以其他方式获得当前用户,但我不知道如何。