3

我有一個使用spring mvc和spring security 3.2開發的web應用程序。我希望我的應用程序使用http基本認證進行寧靜服務,併爲其他部分形成登錄認證。下面是我的安全配置:春季安全,無論是基本的或表單登錄身份驗證

<http pattern="/services/**" create-session="stateless" use-expressions="true"> 
    <intercept-url pattern="/**" access="hasRole('ROLE_REMOTE,ROLE_USER')"/> 
    <http-basic /> 
</http> 

<http auto-config="true" use-expressions="true"> 
    <intercept-url pattern="/static/**" access="permitAll" /> 
    <intercept-url pattern="/**" access="hasRole('ROLE_USER')" /> 
    <form-login login-page="/login.do" always-use-default-target="true"  default-target-url="/main.do" /> 
    <logout invalidate-session="true" logout-success-url="/login.do" 
     logout-url="/j_spring_security_logout" /> 
</http> 

我所期望的是:當從表單用戶登錄,那麼它可以調用RESTful服務沒有經過基本身份驗證(因爲它已經被認證)。我的想法是,角色'ROLE_USER'的用戶也應該調用寧靜的服務。然而,我得到的是我從表單登錄後,我也被提示進行基本身份驗證,嘗試從瀏覽器調用restful服務。

有沒有辦法得到我所期望的?

回答

2

答案可能是在description of the create-session attribute

  • never - 春季安全永遠不會創建一個會話,但會利用一個如果該應用程序的。
  • stateless - 春季安全不會創建一個會話,忽略會話獲得一個Spring認證。

由於您選擇了stateless,在忽略表單登錄後,auth對象在會話中保留。試試never是否按預期工作。

+0

它的工作原理,謝謝。 –

+1

如何解決如果基於表單的登錄中的會話過期,用戶仍會收到HTTP 401未經授權的響應的問題。這會導致瀏覽器顯示基本認證對話框。 – lanoxx