1. 程式人生 > >Spring Security應用開發(11) 並發控制之實踐

Spring Security應用開發(11) 並發控制之實踐

nag line then 9.png page 總結 -c ole for

本文分別介紹了四種不同情況下,Spring Security的Session管理和並發控制的不同配置的配置方法,以及所產生的效果。

(1)首先編寫了session_error.jsp頁面,用於展示session相關錯誤信息。

錯誤信息通過頁面參數id傳入。

<p>Session Error:${param.id }</p>
<p>${SPRING_SECURITY_LAST_EXCEPTION.message}</p>

(2)編寫相應的SessionController類。

@Controller

@RequestMapping(value
="/login") public class SessionController { @RequestMapping("/session_error.action") public ModelAndView session_error(String id){ System.out.println("session_error:" + id); ModelAndView mv = new ModelAndView(); mv.setViewName("login/session_error"); return mv; } }

(3)編寫spring-security.xml

中的session管理相關配置,同時增加相關的匿名訪問控制支持。

(a)情況一:首先測試在session個數超過限制時不報錯,而且沒有配置invalid-session-url的情況。

 <!-- session管理 -->

 <sec:session-management

  session-fixation-protection="changeSessionId"

  session-authentication-error-url="/login/session_error.action?id=max_session_error"

 

  >

  <!--
invalid-session-url="/login/session_error.action?id=invalid_session_error" --> <sec:concurrency-control max-sessions="1" expired-url="/login/session_error.action?id=session_expired_error" error-if-maximum-exceeded="false" /> </sec:session-management> <!-- 匿名訪問 --> <sec:anonymous enabled="true" granted-authority="ROLE_ANONYMOUS" /> <sec:intercept-url pattern="/" access="hasRole(‘ROLE_ANONYMOUS‘) or hasRole(‘ROLE_USER‘)" /> <sec:intercept-url pattern="/login/**" access="hasRole(‘ROLE_ANONYMOUS‘) or hasRole(‘ROLE_USER‘)" />

在瀏覽器1中登錄成功。

技術分享

然後在瀏覽器2中登錄成功。

技術分享

再返回到瀏覽器1中去點擊一個鏈接。

技術分享

可以看到先前已登錄的瀏覽器1的登錄失效過期了。

(b)情況二:再測試測試在session個數超過限制時不報錯,而且配置了invalid-session-url的情況。

 <!-- session管理 -->

 <sec:session-management

  session-fixation-protection="changeSessionId"

  session-authentication-error-url="/login/session_error.action?id=max_session_error"

  invalid-session-url="/login/session_error.action?id=invalid_session_error"

  >

 <sec:concurrency-control  

   max-sessions="1"

   expired-url="/login/session_error.action?id=session_expired_error"

   error-if-maximum-exceeded="false"

 />

 </sec:session-management>

在瀏覽器1中登錄成功。

技術分享

在瀏覽器2中登錄成功。

技術分享

再返回瀏覽器1,點擊一個鏈接。

技術分享

可以看到頁面跳轉到了invalid-session-url指定的URL,而不再是expired-url指定的URL

(c)情況三:測試在session個數超過限制時報錯的情況。此時是否指定invalid-session-url影響不大。

在使用form-login表單驗證的情況下,都將跳轉到form-login的屬性authentication-failure-url指定的URL,如果沒指定此URL,則跳轉到該屬性的默認值指定的URL

<sec:session-management

  session-fixation-protection="changeSessionId"

  session-authentication-error-url="/login/session_error.action?id=max_session_error"

  invalid-session-url="/login/session_error.action?id=invalid_session_error"

  >

 <sec:concurrency-control  

   max-sessions="1"

   expired-url="/login/session_error.action?id=session_expired_error"

   error-if-maximum-exceeded="true"

 />

 </sec:session-management>

<sec:form-login login-page="/login/login_form.action"

      username-parameter="username"

      password-parameter="password"

      login-processing-url="/login/login_process.action"

      authentication-success-forward-url="/login/login_success.action"

      authentication-failure-url="/login/login_failed.action"

  />

  

在瀏覽器1中登錄成功。

技術分享

然後在瀏覽器2中登錄。

技術分享

此時跳轉到了form-loginauthentication-failure-url指定的URL

(d)情況四:測試在session個數超過限制時報錯的情況。在沒有使用form-login表單認證的情況下,超過session個數限制時將跳轉到session-manager的屬性authentication-failure-url指定的URL。本次測試啟用了HTTP basic 認證。

<!-- 登錄相關頁面 -->

 <!--

 <sec:form-login login-page="/login/login_form.action"

      username-parameter="username"

      password-parameter="password"

      login-processing-url="/login/login_process.action"

      authentication-success-forward-url="/login/login_success.action"

      authentication-failure-url="/login/login_failed.action"

  />

  -->

  <!-- HTTP Basic Authentication -->

 <sec:http-basic />

 

在瀏覽器1中登錄成功。

技術分享

在瀏覽器2中登錄:

技術分享

可以看到登錄失敗時頁面跳轉到了session-manager結點的屬性authentication-failure-url指定的URL

對上述四種情況下的測試情況,總結如下:

(1)Spring security的配置參數非常靈活多變,能夠適應比較復雜的應用需求。

(2)配置參數過於靈活,實際應用時容易出錯。

(3)本次測試基本驗證了前一篇博客的內容。

Spring Security應用開發(11) 並發控制之實踐