2016-01-18 39 views
-1

我有thymeleaf模板春季啓動應用程序,並使用HTML與AngularJS作爲我與MySQL作爲數據庫和數據在JSON帶應用程序認證的Spring Boot(403 Fobidden)CSRF令牌爲空。你的會話過期了嗎?

<!DOCTYPE html> 
<html xmlns:th="http://www.thymeleaf.org" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4"> 
<head> 
    <meta name="_csrf" content="${_csrf.token}"/> 
    <meta name="_csrf_header" content="${_csrf.headerName}"/> 
</head> 

我的JS文件傳遞前端,其價值被髮布到:

$scope.logincheck = function() { 

var dataObj = { 
     userId : $scope.userId, 
     password : $scope.password 
}; 

var res = $http.post('http://localhost:9393/company/login', dataObj); 

和相應的控制器,它處理的MySQL認證:

@RequestMapping(value = "/company/login", method = RequestMethod.POST) 

如果啓用CSRF沒有得到調用。在CSRF啓用後,我得到403錯誤,說明發現CSRF標記爲空。

我webconfig.java:

@Override 
    protected void configure(HttpSecurity http) throws Exception { 

     http 
      .addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class) 
      .authorizeRequests() 
      .antMatchers("/resources/**").permitAll() 
      .antMatchers("/", "/login").permitAll() 
       .antMatchers("/hello").access("hasRole('ADMIN')") 
       .anyRequest().authenticated() 
       .and() 
      .formLogin() 
       .loginPage("/login") 
       .permitAll() 
       .and() 
      .logout() 
      .logoutUrl("/logout") 
      .logoutSuccessUrl("/login") 
      .permitAll() 
      .and() 
      .exceptionHandling().accessDeniedPage("/accessdenied") 
      .and() 
      .csrf() 
      .csrfTokenRepository(csrfTokenRepository()); 
    } 

    @Autowired 
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception { 
     auth 
      .inMemoryAuthentication() 
       .withUser("user").password("password").roles("ADMIN") 
    } 

    private CsrfTokenRepository csrfTokenRepository() 
    { 
     HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); 
     repository.setHeaderName("X-XSRF-TOKEN"); 
     return repository; 
    } 

    public class CsrfHeaderFilter extends OncePerRequestFilter { 
      @Override 
      protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) 
       throws ServletException, IOException { 
       System.out.println("Inside Webappconfig.java"); 
      CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class.getName()); 
      if (csrf != null) { 
       Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN"); 
       String token = csrf.getToken(); 
       if (cookie==null || token!=null && !token.equals(cookie.getValue())) { 
       cookie = new Cookie("XSRF-TOKEN", token); 
       cookie.setPath("/"); 
       response.addCookie(cookie); 
       } 
      } 
      filterChain.doFilter(request, response); 
      } 
     } 
+0

您的客戶是什麼?只是普通的js客戶端或jsp? – Aviad

+0

Java代碼沒有jsp! – Vikram

+0

確認彈出窗口來自瀏覽器,所以有客戶端。什麼是客戶?簡單的HTML,JS或一些框架? – Aviad

回答

0

以下代碼解決了這個問題。用httpBasic()函數刪除的最後一行做了訣竅。感謝大家。

.authorizeRequests() 
.antMatchers("/index.html", "/home.html", "/login.html", "/").permitAll() 
      .anyRequest().authenticated() 
      .and() 
      //Add this line to remove Authentication through browser problem 
      .formLogin().loginPage("/login").permitAll(); 
0

與上面的代碼,我收到了確認像對話框 ...

我想這是默認的瀏覽器渲染的Http基本。也許禁用Http Basic明確地幫助:

protected void configure(HttpSecurity http) throws Exception { 
      http 
       .httpBasic().disable() 
      ... 
} 
+0

有)稱爲.httpBasic(沒有這樣的功能,我無法取消驗證,同時重定向到HTML頁面 – Vikram

+0

第一'authorizeRequests'之前,您可以用' httpBasic'方法。 –

+0

試過你沒有運氣建議! – Vikram

0

你做錯了。一旦你想訪問頁面,只是簡單的HTML的情況下,它是受限制的,爲什麼瀏覽器彈出。

我建議從這裏使用一些模板複製演示: http://docs.spring.io/spring-security/site/docs/3.2.x/guides/form.html

如果你不想做的下一件事:

http 
    .authorizeRequests() 
     .anyRequest().authenticated() 
     .and() 
    .formLogin() 
     .and() 
    .httpBasic().disable(); 

請解釋一下您請求了頁面。如果頁面未找到,瀏覽器有時可以執行此彈出窗口。你需要更多地解釋你想完成什麼,頁面本身是什麼,什麼是請求等。

0

在我的情況下,我有應用程序目錄下的js文件。 This dir throw 403 403

添加下面的代碼有所幫助。

.antMatchers(「/ static/**」,「/ app/**」)。permitAll()