2013-07-10 41 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