如何将编辑限制为使用Grails创建的用户

时间:2013-07-28 21:38:20

标签: grails spring-security

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

下一代码完美无缺,这是一个简单易用的解决方案

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. 无法在Config.groovy
  2. 中调用域类Robot
  3. params.id在这个地方毫无意义
  4. Java“或”(||)在此无效。我尝试了其他不幸运的方法。我不清楚Groovy documentation
  5. 可以在Config.groovy中进行吗?如果没有,正确的方法是以某种方式使用<sec:access> ... </sec:access>

1 个答案:

答案 0 :(得分:2)

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

您的老师是正确的,您可能不应该以临时方式实施安全性,但您不一定应该在Config.groovy中执行此操作 - 这有点限制。

您可能希望使用Spring Security ACL plugin,它会添加更多域类,并允许您使用更精细的细节设置访问控制。

结帐the official docs。您可能需要一段时间才能学习它,但它比推出自己的ACL机制要好得多。