如何使用Grails中的过滤器保护用户上传文件的访问权限?

时间:2011-12-06 18:19:53

标签: grails spring-security

我正在构建一个使用Spring Security Core Plugin的Grails应用程序。

我有两个应用程序角色。 ROLE_USER和ROLE_ADMIN

用户可以上传存储在名为 files

的目录中的文件
  1. 外部用户不应该看到任何文件
  2. ROLE_ADMIN用户可以查看每个上传的文件。
  3. 仅在某些情况下才允许ROLE_USER用户
  4. 文件网址请求应如下所示

    http://localhost:8080/MyApp/files/patient1-1.png
    

    对于第一个案例,我在conf / Config.groovy中设置了下一个url拦截器

    grails.plugins.springsecurity.interceptUrlMap = [
        '/files/**': ['ROLE_USER']
    ]
    

    对于第二和第三种情况,我创建了下一个文件conf / MyFilters

    class MyFilters {
        def springSecurityService
    
        public currentUser() {  return User.get(springSecurityService.principal.id);}
        public userRoles()   { return springSecurityService.principal.authorities*.authority }
    
        def filters = {
            fileFilter(uri: '/files/*') {
                before = {
                    println "Here"
                    def String url = request.getRequestURL()
                    if(url.contains("files/patient")) {
                        if(!userRoles().contains(Role.ROLE_ADMIN)) {
                            if(PLAIN ROLE USER IS NOT ALLOWED) {
                              redirect(action:'login')
                              return false;
                            }
                        }
                    }
                }
                after = {
    
                }
                afterView = {
    
                }
            }
        }
    
    }
    

    然而,它似乎没有被触发。我从未看到 Here 打印出来。

    知道我做错了什么吗?

1 个答案:

答案 0 :(得分:1)

你不应该将Grails过滤器与Spring Security混合使用 - 一切都可以从Spring Security中完成。您使用的是“InterceptUrlMap”配置类型(grails.plugins.springsecurity.securityConfigType = "InterceptUrlMap")吗?默认情况下,它使用注释,因此securityConfigType设置将被忽略。

如果您正在使用注释,则可以将此网址格式添加到staticRules配置选项中:

grails.plugins.springsecurity.controllerAnnotations.staticRules = [
   '/files/**': ['ROLE_USER']
]

尝试运行grails clean强制进行完整编译;这可能很简单,因为有些代码不同步。