2012-12-20 66 views
0

我在我的應用程序中使用Spring Security。程序認證

我擁有所有的頁面。但是對於系統用戶和匿名用戶來說,URL的幾個要求都是可用的。

但是匿名用戶不應該直接訪問這些URL。如果此令牌有效,他將獲得具有唯一令牌的鏈接並獲取對某些URL的訪問權限。 我想要做的是:

  1. 在控制器檢查,如果在URL令牌是有效
  2. 如果是 - 在系統編程方式使用一些預定義的登錄名和密碼驗證用戶。該用戶將被配置爲有權訪問必要的URL。

的問題是: 這是一些角色控制器編程方式進行用戶認證,如果令牌是有效的一個正確的做法?這是安全的方法嗎?

+0

爲什麼你需要擺在首位此令牌說大話?無論如何,「正確的」spring安全方式是在一個自定義的'AuthenticationProvider'中實現這一點。 – pap

回答

0

安全性是一個方面。一個方面可以與主代碼(控制器)分離,以減少代碼重複並提高靈活性。將認證代碼從控制器移到新的過濾器(確保此過濾器在彈簧安全過濾器鏈之後執行)。您將能夠通過web.xml保證新的URL(零行代碼)。

+3

更好的是,在Spring-security中使用預期的擴展點,即自定義的'AuthenticationProvider',以減少碎片和複雜性。 – pap

+0

我不確定。即使Spring Security本身也沒有這樣做(參見[AnonymousAuthenticationFilter#doFilter](https://github.com/SpringSource/spring-security/blob/master/web/src/main/java/org/springframework/security/web/)認證/ AnonymousAuthenticationFilter.java)) –

+0

AnonumousAuthenticationFilter實現了'javax.servlet.Filter',但它並不主要用作通用的servlet過濾器,它旨在用於Spring-Security自定義認證過濾器堆棧。這是您可以用來在spring-security中注入自己的自定義身份驗證方案的另一個擴展點。他們爲什麼選擇混合關注(servlet-過濾器簽名和自定義彈簧安全過濾器)來混淆架構,我不知道。 – pap

0

我認爲更好的方式來做到這一點是:

  • 將共享操作到服務層
  • 定義控制器對於那些匿名用戶並使其權威 匿名
  • 檢查的有效性在此控制器中的令牌
  • 如果有效,請調用某些服務方法來執行操作。
  • 渲染結果在該控制器
+0

是的,我現在正在這樣做。 但是,如果這包含向服務器執行Ajax請求的UI控件呢?爲每個ajax請求添加令牌?似乎是醜陋的做法...... –

+0

無論您採用什麼方法將請求發送回服務器,都需要傳遞一些參數。令牌只是其中之一。所以,當請求碰巧是Ajax請求時,我不認爲這是不同的。 – coderLMN