2013-04-14 71 views
4

在appSecurity.xml我有這樣的:秩序的春季安全攔截的URL模式

攔截的URL模式= 「/用戶/型材/ **」 訪問= 「hasRole( 'VIEW_PROFILES')」。

截距-URL模式= 「/用戶/簡檔/編輯/ **」 訪問= 「hasRole( 'EDIT_PROFILES')」

我有一個頁面/用戶/簡檔/編輯/的AddNew並且當用戶用角色VIEW_PROFILES正在嘗試訪問此頁面,但他獲取成功,但阻止了角色EDIT_PROFILES的用戶訪問。

我在做什麼錯了?

回答

1

確保您的EDIT_PROFILES規則在VIEW_PROFILES規則之上。如果您查看VIEW_PROFILES的表達式,您會看到它包含了每一個與EDIT_PROFILES匹配的URL。這意味着如果VIEW_PROFILES規則是第一個,spring安全將永遠不會去嘗試EDIT_PROFILES規則。

9

由於"https://stackoverflow.com/users/profile/edit/""https://stackoverflow.com/users/profile/"更具體,它應該放在列表中更高的位置。

爲什麼

模式在它們被定義的順序總是評價。因此,重要的是更多的特定模式在列表中定義得比較不具體的模式更高。這反映在我們上面的例子中,更具體/安全/超級/模式看起來比不那麼特定/安全/模式更高。如果它們相反,/ secure/pattern將始終匹配,並且/ secure/super/pattern永遠不會被評估。

來源:Core Security Filters

+0

在我的案例中''比'對我來說,這一開始並不明顯。 –

+1

@Matthew,在這種情況下的特殊性規則與請求映射的規則相同。請參閱[路徑模式比較](http://docs.spring.io/spring/docs/current/spring-framework-reference/html/mvc.html):_具有較少的URI變量和通配符的模式被考慮更具體。例如/ hotels/{hotel}/*有1個URI變量和1個通配符,並被認爲比/ hotels/{hotel}/**更具體,因爲它是1個URI變量和2個通配符._ .... – Ritesh

2

兩個約翰·法雷利和僅限Ritesh是正確的。 intercept-url模式按所列順序進行匹配。一旦找到匹配,指定的其餘模式將被忽略。這就是爲什麼你應該早些時候列出更具體的模式。

在你的情況下,/用戶/型材/編輯/ SomePage的模式在第一intercept-url模式中指定的模式相匹配,所以春天適當地檢查,看看是否有問題的用戶擁有指定的訪問角色。顯然,你的EDIT_PROFILES用戶沒有VIEW_PROFILES權限,所以他們被拒絕訪問。同樣,您打算限制訪問具有EDIT_PROFILES權限的用戶對../edit/的訪問權限正被先前的聲明所破壞,該權限授予用戶具有VIEW_PROFIL權限的權限。

切換輕鬆修復的順序,並且您可能希望爲EDIT_PROFILES用戶授予VIEW_PROFILES權限(除EDIT_PROFILES權限外)。然後,考慮使用access="hasAnyRole('REQUIRED_ROLE')"而不是access="hasRole('REQUIRED_ROLE')"來簡化訪問語句。

+0

complete並且容易理解,理論上和實際上有用,很好的答案。 – FaithReaper