2013-07-10 45 views
1

我正在使用Spring安全性開發Spring MVC webapp。所以每個經過身份驗證的用戶都有一個指定的角色基於用戶角色的實體屬性訪問

基於這個ROLE,用戶只能修改實體屬性的一個子集。

現在我試圖通過在視圖中使用彈簧安全標籤來實現此目的,並根據記錄用戶的角色映射不可修改的字段與輸入類型隱藏。但我認爲它很快就會變成一場噩夢!我可以採取以保持事情有什麼其他辦法

<sec:authorize access="hasRole('ROLE_ADMIN')"> 
    Value1: <input type="text" name="value1" value="${entity.value1}" /> 
    Value2: <input type="text" name="value2" value="${entity.value2}" /> 
</sec:authorize> 
<sec:authorize access="hasRole('ROLE_USER')"> 
    Value1: <input type="text" name="value1" value="${entity.value1}" /> 
    Value2: ${entity.value2} 
    <input type="hidden" name="value2" value="${entity.value2}" /> 
</sec:authorize> 
<sec:authorize access="hasRole('ROLE_GUEST')"> 
    Value1: ${entity.value1} 
    Value2: ${entity.value2} 
    <input type="hidden" name="value1" value="${entity.value1}" /> 
    <input type="hidden" name="value2" value="${entity.value2}" /> 
</sec:authorize> 

舉一個簡單的例子,我做這樣的事情(管理員可以修改所有,用戶只能修改value1和客戶不能修改)儘可能簡單?

謝謝 馬爾科

+0

你能告訴夫婦的例子嗎? –

+0

我已經添加了簡單的示例代碼 – gipinani

+0

就像註釋一樣 - 請注意,您還必須仔細檢查是否只在後端修改了允許的字段,否則惡意用戶可能僞造POST請求並添加最初未顯示的字段表格。 –

回答

0

一種方法是使用hasAnyRole([role1,role2])檢查角色的列表。那麼你的代碼將變爲:

<sec:authorize access="hasAnyRole('ROLE_ADMIN' , 'ROLE_USER')"> 
     Value1: <input type="text" name="value1" value="${entity.value1}" /> 
    </sec:authorize> 

    <sec:authorize access="hasRole('ROLE_GUEST')"> 
     Value1: ${entity.value1} 
     <input type="hidden" name="value1" value="${entity.value1}" /> 
    </sec:authorize> 

    <sec:authorize access="hasRole('ROLE_ADMIN')"> 
     Value2: <input type="text" name="value2" value="${entity.value2}" /> 
    </sec:authorize> 
    <sec:authorize access="hasAnyRole('ROLE_USER' , 'ROLE_GUEST')"> 
     Value2: ${entity.value2} 
     <input type="hidden" name="value2" value="${entity.value2}" /> 
    </sec:authorize> 
+0

謝謝你的答案。我知道存在這樣的功能,但它仍然不會改變工作完成的方式,即通過使用隱藏的輸入類型。我正在尋找另一個想法,以避免在視圖中使用輸入類型隱藏和檢查表達式,並且還要避免Kresimir Nasek在之前的評論中解釋的問題:請注意,您還必須仔細檢查是否只允許修改允許的字段在後端也是如此,否則惡意用戶可能僞造POST請求並添加最初未顯示在表單中的字段 – gipinani