如何通过外部调用注销Spring Security中的用户

时间:2018-08-24 06:09:09

标签: spring spring-mvc spring-boot spring-security spring-session

我有一个实现了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安全性流程进行注销。

谢谢

2 个答案:

答案 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,这将触发注销。