【问题标题】:java.lang.String cannot be cast to java.lang.Long in Spring Security ACLjava.lang.String 不能在 Spring Security ACL 中强制转换为 java.lang.Long
【发布时间】: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 服务器并重新启动它时,错误就消失了。这里可能属于一些缓存问题。

有没有办法捕捉这个错误,例如,在以前没有设置 ACL 的情况下?

注意:这个问题仍然没有答案。

【问题讨论】:

  • 我不清楚新的步骤 - 首先你在没有公司的时候去列表,所以返回空列表,然后你创建两次(?) company1。好的,但是您没有分配 ACL,因为它看起来您在 addPerm 方法上有这部分,所以即使在这个阶段,如果您返回列表,您将面临问题
  • 我更正了这些步骤。对不起。即使您返回列表并且没有权限,由于过滤器,它应该返回一个空列表。你能重现这个错误吗?
  • 看起来像持久性问题,要重现我现在需要安装 mysql 而不是 H2;将尝试设置它。如果您没有权限,我预计会出现错误,因为公司已保存
  • 不保存公司时没有错误。保存后你有权限,但在 grails clean 后你没有。
  • 好的,我已经安装了 mysql 来重现你,我不能 - 它在这里正常工作。我登录,创建公司和烫发,没关系。我停止服务器并清理。再次运行应用程序,我的数据仍然存在(我从localhost:8080/test2/dbconsole 验证)然后我可以成功返回列表,服务器上没有错误,没有抛出异常。重新启动服务器时可以检查 cal_entry 表吗?您的数据应该仍然存在。

标签: grails spring-security acl


【解决方案1】:

这个问题似乎实际上与AclSid 覆盖插件中的方式有​​关。

当插件类以某种方式获胜时,您将看到java.lang.String cannot be cast to java.lang.Long 问题。

一般来说有一个简单的修复方法,你应该在执行grails clean 之后始终运行grails package,而且你还需要确保在你的 ci 服务器上运行package 步骤,然后再构建你的战争。

自从我们使用 UUID 并且必须使 AclSid 类也有一个用于 sid 的字符串后,我已经看到了同样的问题。一旦我们开始正确运行打包步骤,我在生产或本地都没有问题。

【讨论】:

  • 让我检查一下。你知道eclipse为什么报这个错误吗:stackoverflow.com/questions/31585864/…
  • 所以在我的生产服务器上你建议运行:1)grails clean,2)grails prod package3)grails prod war。这里有什么遗漏吗?
  • grails 干净; grails包;圣杯战争;应该没事。无需添加产品。
  • 很棒的作品,谢谢。你对此有什么想法吗:stackoverflow.com/questions/31585864/…
猜你喜欢
  • 1970-01-01
  • 2013-07-27
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多