0

任何用户都可以创建他/她自己的机器人。机器人只能由创建者或管理员编辑。

一个代码完美运行,这是一个简单易用的解决方案

import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils

class RobotController {

    def springSecurityService

    def edit() {

        if (Robot.get(params.id).usuario.username == springSecurityService.authentication.name
         || SpringSecurityUtils.ifAnyGranted("ROL_ADMIN,ROL_SUPERADMIN"))               
            println "editing allowed"
        else
            println "editing denied"

    }
}

但是我的老师建议我使用 Config.groovy来保护网络。下一个代码不起作用

grails.plugins.springsecurity.interceptUrlMap = [
    '/index.gsp': ["isAuthenticated()"],
    '/robot/edit/**': ["Robot.get(params.id).usuario.username == springSecurityService.authentication.name
                        || hasAnyRole('ROL_ADMIN','ROL_SUPERADMIN')"],
    '/robot/**': ["isAuthenticated()"]
]

它不起作用,因为不同的原因:

  1. 无法Robot在 Config.groovy中调用域类
  2. params.id在这个地方没有意义
  3. Java“或”( ||) 在这里无效。我尝试了其他没有运气的方法。Groovy 文档对我来说不是很清楚。

可以在 Config.groovy 中做到这一点吗?如果没有,正确的方法会以<sec:access> ... </sec:access>某种方式使用?

4

1 回答 1

2

我不认为你可以用普通的 Spring Security 核心做那种事情。

从某种意义上说,您的老师是对的,您可能不应该以特别的方式实现安全性,但您不一定应该在 Config.groovy 中这样做——这有点限制。

您可能想要使用Spring Security ACL 插件,它添加了更多的域类,并允许您设置具有更精细细节的访问控制。

查看官方文档。你可能需要一点时间来学习它,但它比推出你自己的 ACL 机制要好得多。

于 2013-07-28T23:45:01.677 回答