如何限制用户访问控制器的特定操作?

时间:2011-05-16 11:22:15

标签: grails filter controller action interceptor

 def filters = {
   loginCheck(controller:'*', action:'*') {
        before = {
           if(!session.user && !session.merchants) 
           {
               redirect(action:'login')
               return false
            }
        }}

这是我的登录安全过滤器。以下是用于限制用户进行搜索操作的拦​​截器。但两者都不起作用。任何人都可以说出错误是什么吗?

def beforeInterceptor = [action:this.&checkUser,Only:'search']

    def scaffold = true
    def checkUser() 
    {
        if (session.user)
        {
            redirect(action:"search")
        }
        if(session.merchants)
        {
        redirect(action:"toIndex")
        flash.message="You are not valid user for this action"
        return false
        }   
    }

2 个答案:

答案 0 :(得分:0)

实际上,您应该为每个控制器和每个操作设置过滤器。 这是参考文献中的grails示例:

class SecurityFilters {
   def filters = {
       loginCheck(controller:'*', action:'*') {
           before = {
              if(!session.user && !actionName.equals('login')) {
                  redirect(action:'login')
                  return false
               }
           }
       }
   }
}

我使用了这个,它对我有用。 我不确定您的代码中的session.merchants。 这是什么 ?

你有没有这样做:

  

要创建过滤器,请创建一个类   结束于约定的过滤器   grails-app / conf目录。


编辑: 如果使用spring security,则无需添加过滤器或拦截器。 查看用户指南:http://burtbeckwith.github.com/grails-spring-security-core/docs/manual/index.html

您可以使用网址映射或注释对其进行配置。

离。

grails.plugins.springsecurity.controllerAnnotations.staticRules = [
   '/js/admin/**': ['ROLE_ADMIN'],
   '/someplugin/**': ['ROLE_ADMIN']
]

编辑2:

要让登录用户使用:

 def authenticateService

...
def action{
     def user = authenticateService.principal() 
     def username = user?.getUsername()
...

答案 1 :(得分:0)

有一个非常好的速记,你可以直接应用于动作(如果你没有使用过滤器):

@Secured(['ROLE_USER'])
def search = {

}

您可以为每个用户提供ROLE_USER,只需要该角色。