在Grails中使用Spring Security来限制内容访问

时间:2013-12-01 00:58:47

标签: spring grails spring-security

让我再次开始说我还是Grails和Spring Security的新手。我一直在尽力筛选文档,示例和示例。这一切都让我有点困惑或不堪重负。

我正在尝试使用Spring来管理用户对信息的访问。我有一个网站框架。我希望管理员能够添加人员,连接到人员的位置和位置的图像。图片与此人相关联。我希望登录的人只能看到他们的照片。

使用sec标签或@Secure注释或组合执行此操作是更好还是最佳做法?哪个最安全?我使用sec:标签限制访问。是否有一个sec:标签我可以用来选择要显示的图片吗?

1 个答案:

答案 0 :(得分:3)

我认为你可以用更简单的方式看待这个问题。基本的插件安装基本上有3种方法来管理安全性。

  • @Secured - 这允许您锁定对整个Controller和/或单个操作的访问。可以将此视为将URL锁定到一组特定角色。对此安全级别的更改将需要重新部署。
  • 请求地图 - 您可以获得与@Secured相同的好处,并且可以在运行环境中修改控制器/操作安全性,而不必进行重新部署。
  • sec tags - 这些允许您锁定视图的渲染。例如,允许编辑按钮显示一个角色,同时将其隐藏为另一个角色。 sec标签与上述方法结合使用。

基本上就是这样。以上都不比另一个更安全或更不安全。有些人似乎混淆的是“我的数据”的概念以及Spring Security如何处理这个问题。如果在控制器中,您希望用户只能访问其“图片”,则应根据经过身份验证的用户查询“图片”。

def authenticatedUser = User.findByUsername(springSecurityService.principal.username)
def pictures = Picture.findAllByUser(authenticatedUser)

然后视图只关心您发送给它的图片。每个登录的用户只能看到他们的照片。如果管理员已登录,并且需要查看所有图片,您可能会执行以下操作:

def authenticatedUser = User.findByUsername(springSecurityService.principal.username)
if (SpringSecurityUtils.ifAllGranted("ROLE_ADMIN")) {
   def pictures = Pictures.list() 
}

但是,我可能只是为了管理目的而单独使用一个控制器而不是在一个控制器中尝试执行太多逻辑。或者,将逻辑移动到服务。

希望这有帮助。