我是spring mvc的新手,在我的现有项目中,有一个管理员拥有更新数据的权限,但现在我需要创建两个新的管理员,admin1和admin2,他们登录时只能看到有限的页面,例如:
当管理员登录时,他们可以在菜单栏中看到添加数据、更新数据、发布消息页面。而对于Admin1来说,他只能在菜单栏中看到发布消息页面。
请指导我如何在spring mvc中实现这个任务。 提前感谢您。
我是spring mvc的新手,在我的现有项目中,有一个管理员拥有更新数据的权限,但现在我需要创建两个新的管理员,admin1和admin2,他们登录时只能看到有限的页面,例如:
当管理员登录时,他们可以在菜单栏中看到添加数据、更新数据、发布消息页面。而对于Admin1来说,他只能在菜单栏中看到发布消息页面。
请指导我如何在spring mvc中实现这个任务。 提前感谢您。
<http auto-config="true">
<intercept-url pattern="/admin*" access="ROLE_ADMIN" />
</http>
这意味着只有具备“ROLE_ADMIN”权限的用户才能访问URI /admin*。如果未经授权的用户尝试访问它,将显示“http 403 access denied page”。
您需要配置URL和允许访问它们的权限。
简单的示例请参见http://www.mkyong.com/spring-security/spring-security-access-control-example/
ADMIN1 -> PERM_ADD, PERM_POST
ADMIN2 -> PERM_POST, PERM_UPDATE
@Autowired
RolePermissionsRepository repository;
public void setup1(){
String roleName = "ROLE_ADMIN1";
List<String> permissions = new ArrayList<String>();
permissions.add("PERM_ADD");
permissions.add("PERM_POST");
repository.save(new RolePermissions(roleName, permissions));
}
public void setup2(){
String roleName = "ROLE_ADMIN2";
List<String> permissions = new ArrayList<String>();
permissions.add("PERM_UPDATE");
permissions.add("PERM_POST");
repository.save(new RolePermissions(roleName, permissions));
}
然后使用访问权限而不是角色。
<http auto-config="true">
<intercept-url pattern="/addData" access="PERM_ADD" />
<intercept-url pattern="/updateData" access="PERM_UPDATE" />
<intercept-url pattern="/postMessage" access="PERM_POST" />
</http>
@PreAuthorize("hasAuthority('PERM_ADD')")
@RequestMapping("/add")
public String add() {
...
}
源代码请见此处 - https://github.com/savantly-net/spring-role-permissions
您需要在Spring安全中创建两个具有不同访问权限的角色。
<http auto-config="true">
<intercept-url pattern="/addData" access="ADMIN_2" />
<intercept-url pattern="/updateData" access="ADMIN_2" />
<intercept-url pattern="/postMessage" access="ADMIN_1" />
</http>
你当然需要两个角色。- 然后你可以选择
- 检查角色Admin1或Admin2
或在任何地方检查Admin1
。
- 但更好的方法已经被你提到:分离角色和权限:将角色分配给用户,将权限分配给角色,这样用户通过其角色获得其权限。现在你只需要检查权限以允许访问一个函数。
Spring已经有了内置的14.4层次角色概念,但我觉得它很笨拙,因为它要求每个投票者都需要理解它。所以我实现了我的自己的解决方案,它非常简单,只基于Spring-Security-Roles。所以你只需要改变角色提供者,而不需要做其他的事情。