在Grails中保护用户的控制器操作

时间:2012-04-05 23:13:01

标签: grails spring-security grails-plugin

我在项目中使用Grails安全性插件。我正在使用控制器操作上的注释来限制对某些类用户的访问,例如“ROLE_ADMIN”或“ROLE_USER”。

(以此作为我正在做的事情的基础:http://grails-plugins.github.com/grails-spring-security-core/docs/manual/guide/5%20Configuring%20Request%20Mappings%20to%20Secure%20URLs.html#5.1%20Defining%20Secured%20Annotations

我的问题是,如何限制操作,以便用户只能看到有关自己的信息。例如,假设我有一个id = 1的用户。如果我有一个显示用户信息的操作:

mySite/User/Show/1

如何阻止id = 1的同一用户访问

mySite/User/Show/2

?有一种简单的方法可以做到这一点吗?

5 个答案:

答案 0 :(得分:1)

以下是什么问题?:

class SomeController {
    springSecurityService
    // other stuf ...
    def show () {
       User user = User.get(params)
       User logged = User.get(springSecurityService.principal.id)
       if (user.id != logged.id) {
          flash.message = "You can't see the profile of other users"
          redirect action:"list" // You can redirect to other controller/action
          return //Since grails 2 this is needed
       }
       // Logic for display your user
    }
    // other stuf ...
}

答案 1 :(得分:1)

如果要将相同的逻辑应用于多个操作,也可以使用Grails控制器拦截器

class SomeController {

 def beforeInterceptor = [action: this.&checkUser ] 

   def springSecurityService

def checkUser() {
    User user = User.get(params)
       User logged = User.get(springSecurityService.principal.id)
       if (user.id != logged.id) {
   {
       redirect(action: "accessDenied", controller='access' id: params.long("id")) //re-direct accessDenied page
   return false
   }
    return true;
}

}

   Class AccessController{
     def accessDenied= {

        render(view: "accessDenied")

    }
 }

答案 2 :(得分:0)

您所询问的是您的业务规则的一部分。因此,您应该在代码中处理这些场景,而不是寻找一些插件或帮助程序代码。

您可以为此做的是,确保访问用户详细信息的用户的ID与正在质疑其详细信息的用户的ID相同。

您也可以在对象级别进行此检查,但这将意味着对数据库进行额外查询以获取用户详细信息。

希望这有帮助。

答案 3 :(得分:0)

我必须同意您正在尝试实施具有安全性方面的业务规则。如果用户创建了某种文档,您就不会使用授权来选择其个人资料页面上显示的内容,是吗?

您必须在授权方面到达的位置和业务规则的开始位置划一条线。

根据我的经验,为了避免模糊线条,我总是使用授权角色作为与一组功能相关联的用户类型。特定用户类型可以访问一系列故事或用例。这些用例受限于特定角色。

如果您开始询问有关数据可见性的问题(页面上隐藏的内容,具体取决于任何业务因素),那么您应该清楚自己的安全框架

答案 4 :(得分:0)

我不同意您需要重新定义业务逻辑与安全逻辑。这是一个常见的用例,授权应该涵盖它。这就是Grails有过滤器的原因。使用授权过滤器添加如下功能:

class AuthorizationFilters {
    def filters = {
        userCheck(controller: 'user', action: '*') {
            before = {
                // Check current user id is param.id here
            }
        }
    }
}

因此,您的安全逻辑位于控制器之外。您可以添加其他控制器,如果它们传入用户ID,或者甚至是其他方法,以检查当前用户是否拥有域类。