我有一个实现了Spring安全性的Spring Boot应用程序。用户登录和注销成功运行,并且我正在使用jdbc进行会话存储。 现在,我只想实现一个新的休息终点,即接受特定用户的userName作为参数并注销该用户。 目前,我正在使用以下类作为注销权限。
@Component
public class CustomLogoutHandler extends SecurityContextLogoutHandler {
@Override
public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
super.logout(request, response, authentication);
}
}
但是我的问题是如何使用此类或内置的Spring注销从外部请求中注销用户? 对于session_store,我正在使用以下配置,并且用户会话已成功保存在数据库中。
#Spring Session
spring.session.store-type=jdbc
spring.session.jdbc.table-name= SESSION_TABLE
可以从表中手动删除表条目,这将注销用户。 但是我想通过遵循正确的Spring安全性流程进行注销。
谢谢
答案 0 :(得分:1)
我认为您可以使用spring会话注销特定用户,而只需在控制器中自动装配会话存储库即可。 如果我很了解您已经配置了JdbcOperationsSessionRepository,那么您可以这样做:
@Autowired
private org.springframework.session.jdbc.JdbcOperationsSessionRepository sessionRepository;
,然后使用您的存储库查找与特定用户有关的会话
sessionRepository.findByIndexNameAndIndexValue(FindByIndexNameSessionRepository.PRINCIPAL_NAME_INDEX_NAME, somePrincipalName);
答案 1 :(得分:-1)
这是我的处理方式:
HttpSession
注入其中类似的东西:
@Scope("session")
@Controller
public class LogoutController {
@PostMapping("/logout")
public ResponseEntity logout(HttpSession session) {
session.invalidate();
return new ResponseEntity().ok();
}
}
我也不确定为什么您不使用Spring提供的注销配置:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter{
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// config your credentials provider here
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.
authorizeRequests()
// protected endpoints config here
.and()
.logout().logoutUrl("/logout")
.and().csrf().disable();
}
}
您可以使用POST直接调用/logout
,这将触发注销。