我正在构建一个使用Spring Security Core Plugin的Grails应用程序。
我有两个应用程序角色。 ROLE_USER和ROLE_ADMIN
用户可以上传存储在名为 files
的目录中的文件文件网址请求应如下所示
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 打印出来。
知道我做错了什么吗?
答案 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
强制进行完整编译;这可能很简单,因为有些代码不同步。