【发布时间】:2015-07-23 20:57:14
【问题描述】:
我使用 Spring Security ACL plugin 并且之前没有设置 ACL。我想访问以下服务方法:
@PostFilter("hasPermission(filterObject, read) or hasPermission(filterObject, admin)")
List<Company> list(Map params = [:]) {
return Company.list(params)
}
我向一家公司的管理员用户授予了权限。当我访问上述方法时,一切正常。当我停止服务器并执行grails clean 时会出现问题。当我重新启动并访问上述方法时,出现以下错误。这很奇怪,因为它在 grails clean 之前第一次工作没有错误。
2015-08-08 14:57:02,509 [http-nio-8080-exec-5] ERROR errors.GrailsExceptionResolver - ClassCastException occurred when processing request: [GET] /test2/home/list
java.lang.String cannot be cast to java.lang.Long. Stacktrace follows:
Message: java.lang.String cannot be cast to java.lang.Long
Line | Method
->> 305 | doCall in org.grails.datastore.gorm.GormStaticApi$_withCriteria_closure11
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 302 | execute in org.grails.datastore.mapping.core.DatastoreUtils
| 37 | execute . . . . . . . in org.grails.datastore.gorm.AbstractDatastoreApi
| 304 | withCriteria in org.grails.datastore.gorm.GormStaticApi
| 128 | lookupObjectIdentities in grails.plugin.springsecurity.acl.jdbc.GormAclLookupStrategy
| 106 | doCall in grails.plugin.springsecurity.acl.jdbc.GormAclLookupStrategy$_readAclsById_closure1
| 78 | readAclsById . . . . . in grails.plugin.springsecurity.acl.jdbc.GormAclLookupStrategy
| 288 | readAclsById in grails.plugin.springsecurity.acl.AclService
| 127 | list . . . . . . . . . in test2.HomeController
| 198 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter . . . . . . . in grails.plugin.cache.web.filter.AbstractFilter
| 53 | doFilter in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
| 62 | doFilter . . . . . . . in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
| 1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 617 | run . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run in java.lang.Thread
Error |
2015-08-08 14:57:03,030 [http-nio-8080-exec-6] ERROR errors.GrailsExceptionResolver - ClassCastException occurred when processing request: [GET] /test2/home/list
java.lang.String cannot be cast to java.lang.Long. Stacktrace follows:
Message: java.lang.String cannot be cast to java.lang.Long
Line | Method
->> 305 | doCall in org.grails.datastore.gorm.GormStaticApi$_withCriteria_closure11
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 302 | execute in org.grails.datastore.mapping.core.DatastoreUtils
| 37 | execute . . . . . . . in org.grails.datastore.gorm.AbstractDatastoreApi
| 304 | withCriteria in org.grails.datastore.gorm.GormStaticApi
| 128 | lookupObjectIdentities in grails.plugin.springsecurity.acl.jdbc.GormAclLookupStrategy
| 106 | doCall in grails.plugin.springsecurity.acl.jdbc.GormAclLookupStrategy$_readAclsById_closure1
| 78 | readAclsById . . . . . in grails.plugin.springsecurity.acl.jdbc.GormAclLookupStrategy
| 288 | readAclsById in grails.plugin.springsecurity.acl.AclService
| 127 | list . . . . . . . . . in test2.HomeController
| 198 | doFilter in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter . . . . . . . in grails.plugin.cache.web.filter.AbstractFilter
| 53 | doFilter in grails.plugin.springsecurity.web.filter.GrailsAnonymousAuthenticationFilter
| 62 | doFilter . . . . . . . in grails.plugin.springsecurity.web.authentication.logout.MutableLogoutFilter
| 1142 | runWorker in java.util.concurrent.ThreadPoolExecutor
| 617 | run . . . . . . . . . in java.util.concurrent.ThreadPoolExecutor$Worker
^ 745 | run in java.lang.Thread
我在这里创建了一个演示项目:https://github.com/confile/Spring-Security-ACL-Bug
复制它:
- 创建一个mysql数据库名称:test
- grails dbm 更新
- grails 运行应用程序
- http://localhost:8080/test2/home/list
- 使用用户登录:admin 密码:admin
- http://localhost:8080/test2/home/createCompany1
- http://localhost:8080/test2/home/addPerm
- http://localhost:8080/test2/home/createCompany2
- http://localhost:8080/test2/home/list
- 停止服务器
- 圣杯干净
- grails 运行应用程序
- http://localhost:8080/test2/home/list
编辑: 我发现当我关闭我的 mysql 服务器并重新启动它时,错误就消失了。这里可能属于一些缓存问题。
有没有办法捕捉这个错误,例如,在以前没有设置 ACL 的情况下?
注意:这个问题仍然没有答案。
【问题讨论】:
-
我不清楚新的步骤 - 首先你在没有公司的时候去列表,所以返回空列表,然后你创建两次(?) company1。好的,但是您没有分配 ACL,因为它看起来您在 addPerm 方法上有这部分,所以即使在这个阶段,如果您返回列表,您将面临问题
-
我更正了这些步骤。对不起。即使您返回列表并且没有权限,由于过滤器,它应该返回一个空列表。你能重现这个错误吗?
-
看起来像持久性问题,要重现我现在需要安装 mysql 而不是 H2;将尝试设置它。如果您没有权限,我预计会出现错误,因为公司已保存
-
不保存公司时没有错误。保存后你有权限,但在 grails clean 后你没有。
-
好的,我已经安装了 mysql 来重现你,我不能 - 它在这里正常工作。我登录,创建公司和烫发,没关系。我停止服务器并清理。再次运行应用程序,我的数据仍然存在(我从localhost:8080/test2/dbconsole 验证)然后我可以成功返回列表,服务器上没有错误,没有抛出异常。重新启动服务器时可以检查 cal_entry 表吗?您的数据应该仍然存在。
标签: grails spring-security acl