2016-12-07 151 views
2

我的應用程式同時服務網頁和休息端點(春季啓動+彈簧4)春季安全註銷發出

我想設置一個基本的InMemoryAuth,但/註銷不起作用。

從瀏覽器中,它重定向到/ login?註銷404,對用戶會話沒有影響。

@EnableWebSecurity 
@Configuration 
class WebSecurityConfig extends WebSecurityConfigurerAdapter { 


    @Override 
    protected void configure(HttpSecurity http) throws Exception { 
    http 
     .authorizeRequests() 
     .antMatchers("/rest/**").hasRole("USER") 
     .antMatchers("/ui/**").hasRole("USER") 
     .and().logout() 
      .logoutUrl("/logout") 
     .and().httpBasic() 
     .and().csrf().disable(); 
    } 

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

EDIT

與followind鏈

http 
    .authorizeRequests().anyRequest().authenticated() 
    .and().logout().logoutUrl("/logout").logoutSuccessUrl("/").permitAll() 
    .and().httpBasic() 
    .and().csrf().disable(); 

和限定的根頁面,沒有404錯誤。

使用調試啓用,我能看到

Logging out user 'org.springframew[email protected]442b5a9f: Principal: [email protected]: Username: user; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_USER; Credentials: [PROTECTED]; Authenticated: true; Details: org.sprin[email protected]b364: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: null; Granted Authorities: ROLE_USER' and transferring to logout destination 
Invalidating session: B264148444D372CFC899A5B920818B68 

但瀏覽器不要求用戶/ passwd文件了,我能夠訪問所有的URL ..

回答

2

默認成功URL註銷是/login?logout。由於您沒有配置formLogin(),因此您將擁有/login,這就是您獲得404的原因。您最好更改logout().logoutSuccessUrl("/"),以便它將重定向到根目錄。

UPDATE

回答了這個問題的EDIT部分。您有以下

httpBasic() 

這意味着當你在瀏覽器提供的瀏覽器會發送以下標題爲你讓你的春季安全保護的站點請求彈出輸入用戶名和密碼,啓用HTTP基本。

Authorization: Basic base64(username+":"+password) 

這就是爲什麼你可以訪問所有的網址。如果未登錄,它將繼續登錄用戶輸入每個請求。可悲的是目前沒有解決這個問題的方法。這是根據維基百科。

現有的瀏覽器保留的認證信息,直到選項卡或 關閉瀏覽器或用戶清除歷史記錄。 [1] HTTP不爲 提供了一種方法,服務器可以指示客戶端放棄這些緩存的憑證。這意味着 服務器沒有有效的方式來在不關閉瀏覽器的情況下「註銷」用戶。這是一個 重大缺陷,需要瀏覽器製造商支持 「註銷」用戶界面元素(在RFC 1945中提到,但不是由大多數瀏覽器實現的 )或JavaScript可用的API,對HTTP的進一步 擴展或使用現有替代技術,如 通過SSL/TLS檢索頁面,並在 URL中使用不可猜測的字符串。

+1

這就是我才發現這裏http://stackoverflow.com/a/5033081/1853780 我猜的解決方案是我的應用程序拆分成2級獨立的應用程序,一個休息與基本身份驗證,其他與經典登錄表單服務網頁。感謝回覆 ! –