【问题标题】:Using Spring Security in Grails to restrict content access在 Grails 中使用 Spring Security 来限制内容访问
【发布时间】:2013-12-01 14:16:57
【问题描述】:

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

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

使用 sec 标记或 @Secure 注释或组合执行此操作是否更好或最佳实践?哪个最安全?我使用 sec:tags 限制了访问。是否有 sec:tag 可以用来选择要显示的图片?

【问题讨论】:

    标签: spring grails spring-security


    【解决方案1】:

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

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

    基本上就是这样。以上没有一个比另一个更安全。有些人似乎混淆了“我的数据”的概念以及 Spring Security 如何处理它。如果在 Controller 中,您希望用户只能访问他们的“图片”,您应该只根据经过身份验证的用户查询“图片”。

    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() 
    }
    

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

    希望这会有所帮助。

    【讨论】:

    • 是的,这确实有道理,谢谢!!它让事情变得更好。
    • 好的,让我问这个。我有我的索引页 sec:tagged 以便管理员可以看到控制器上传文件创建数据和用户。用户有用户名、密码和位置。当用户登录时,我希望他们看到与其位置相关的文件。一个位置可以有多个用户。但我希望每个具有该位置的用户都能看到相关文件。我盯着@Secure,但移到了 sec:tags。现在我只需要根据位置限制文件的显示。有什么建议吗?
    • 开始一个新问题。
    • 新线程开始“使用 Spring Security 在 Grails 中根据用户选择要显示的内容”
    猜你喜欢
    • 1970-01-01
    • 2012-08-16
    • 2013-08-26
    • 2016-02-16
    • 2012-04-19
    • 2017-05-22
    • 2014-03-03
    • 2013-11-25
    • 2018-11-28
    相关资源
    最近更新 更多