2015-04-25 33 views
0

所以我在Spring Boot中使用了Spring Security。我想讓我自己AuthenticationProvider,使用DB在我自己的方式是,所以我用這個authenticate方法做到了:爲什麼在註銷之後SpringSecurity一直給出相同的認證主體

@Override 
    public Authentication authenticate(Authentication authentication) throws AuthenticationException { 
     String email = authentication.getName(); 
     String password = authentication.getCredentials().toString(); 


     UserWithEmail userWithEmail = authService.getUserByEmail(email); 
     if (userWithEmail == null) 
      return null; 
     if (userWithEmail.getPassword().equals(password)) { 



      UsernamePasswordAuthenticationToken authenticated_user = new UsernamePasswordAuthenticationToken(userWithEmail, password, Arrays.asList(REGISTERED_USER_SIMPLE_GRANTED_AUTHORITY)); 
      return authenticated_user; 
     } else { 
      return null; 
     } 
    } 

這一點,如果我使用缺省的/登錄頁面的形式,作品好,以後如果我添加以下ModelAttributeController,它得到正確充滿UserWithEmail對象:

@ModelAttribute("userwithemail") 
    public UserWithEmail userWithEmail(){ 
     Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); 

     Object principal = authentication.getPrincipal(); 
     if (principal instanceof UserWithEmail) 
      return (UserWithEmail) principal; 
     else 
      return null; 

    } 

的問題是,如果我打/登錄註銷,它正確地顯示我登錄了呢? ,但如果我再次通過控制器,我仍然會得到與UserWithEmail相同的對象本金和它的屬性authenticated=true

這是我的Java配置春季安全:

http 
       .formLogin() 
       .defaultSuccessUrl("/") 
       .usernameParameter("username") 
       .passwordParameter("password") 
       .and() 

       .logout().invalidateHttpSession(true).deleteCookies("JSESSIONID").permitAll().and() 

       .authorizeRequests() 
       .antMatchers("*/**").permitAll() 
       .antMatchers("/static/**").permitAll() 
       .antMatchers("/profile").hasRole(MyAuthenticationProvider.REGISTERED_USER_AUTH) 

       .and().authenticationProvider(getAuthProvider()); 

我是新來的Spring Security所以也許我失去了一些東西...誰能幫助?

回答

0

根據文檔here for CSRF POST是強制註銷,以及CSRF令牌的攻擊保護。

因爲我使用的是自定義的模板引擎,我不得不從請求攔截CSRF令牌模型中的屬性,就像這樣:

@ModelAttribute("crsf_token") 
public CsrfToken getcrsfToken(HttpServletRequest request, Model model) { 
    CsrfToken token = (CsrfToken) request.getAttribute("_csrf"); 

    return token; 
} 

,因爲它沒有得到複製的模型我的模板引擎。

相關問題