我的用户访问方式是否正确?

时间:2013-05-24 00:11:33

标签: spring-security

我在jsp页面上应用spring security,我需要向具有不同角色的用户显示页面的不同部分,所有角色如下。

所有经过身份验证的用户>>编辑并添加新

管理员>删除和编辑并添加新

匿名>添加新

<sec:authorize
        access="isAuthenticated()">
          Code of add new and edit buttons
 </sec:authorize>

 <sec:authorize 
         access="hasAnyRole('ADMIN')">
   Code to add new, edit and delete buttons
 </sec:authorize>

  <sec:authorize 
         access="isAnonymous()">
     Code to add new
  </sec:authorize>

我想知道是否有更简单的方法,在这种情况下,如果我想修改特定角色的访问权限,我必须更改其在security.xml文件中的访问规则以及我已设置角色访问权限的每个页面。

例如,假设我想要Admin角色无法访问删除按钮,那么我必须更改security.xml的代码以及admin角色经过身份验证的所有JSP页面以查看删除按钮。

有没有更简单的方法来做到这一点!?

4 个答案:

答案 0 :(得分:2)

我认为没有内置的解决方案。您可以设置一个细粒度的角色系统,像编辑角色,删除角色等一样。然后,您可以更自由地分配这些角色。   如果您希望为用户保持简单(例如仍然只显示管理员和用户角色),您可能必须屏蔽角色与向用户显示的标题之间的映射背后的实际角色。

另一种方法是为每个操作(编辑,删除等)设置全局参数,您可以在其中指定操作允许的角色。这样,您就不会将角色硬编码到应用程序中,而是通过全局参数映射它们。

期待看到其他人想出更好的主意。

编辑以指定按全局参数映射的方法 (精炼后映射将存储在数据库中,但是从临时解决方案到实现ACL):

使用全局参数我只是意味着rightsMapping.properties。在此文件中,您将映射类似的内容:

right.edit=ROLE_USER, ROLE_ADMIN
right.edit=ROLE_ADMIN
etc...

之后,您可以使用以下内容将权限插入jsf页面:

<f:loadBundle basename="rightsMapping" var="rights"/>
....
<f:CommandButton name="edit" .... rendered="hasRole(rights.edit)"/>

这是一个非常容易实现的解决方案,可以通过使用例如DB中的映射表,Bean评估访问权限等来改进。但是将细粒度权限映射到角色的基本思想保持不变

答案 1 :(得分:2)

可以使用权限集来解决方案,该权限集可以作为集合包含在角色对象中。

执行此实现后,您可以检查显示按钮的权限,如果要更改安全体系结构中的任何内容,可以通过授予或撤消相关角色的权限来轻松管理。

可以在下面的链接中看到这方面的一个例子。

http://en.tekstenuitleg.net/blog/spring-security-with-roles-and-rights

答案 2 :(得分:1)

我认为您在应用中的任何位置都拥有编辑按钮的相同权限。在这种情况下,您可以将自动化代码提取到一些自定义标记中(我建议JSP tag files)。对于每个编辑按钮,您将使用自定义标记:

<customtags:hasEditPermission>
     Edit button code goes here
<customtags:hasEditPermission>

所有权限都将在hasEditPermission.tag中声明一次:

<%@tag description="Edit permission tag" pageEncoding="UTF-8"%>
<sec:authorize  access="hasAnyRole('ADMIN')">
    <jsp:doBody/>
</sec:authorize>

因此,在新POWER_USER角色的情况下,您只需要修改一个文件:

<%@tag description="Edit permission tag" pageEncoding="UTF-8"%>
<sec:authorize  access="hasAnyRole('ADMIN', 'POWER_USER')">
    <jsp:doBody/>
</sec:authorize>

您也可以为“添加新”和“删除”按钮准备和使用标签。希望这会有所帮助。

答案 3 :(得分:0)

这可能就是你looking for, with sample code

在你的情况下,你会有BF_ADD_XXX,BF_EDIT_XXX和BF_DELETE_XXX等。

这允许您向/从特定角色授予/撤消特定权限(或BF或业务功能或任何您想要调用它们的权限)。