Я использую Spring Security ACL plugin и не имею ACL, установленных ранее. Я хочу получить следующие услуги:java.lang.String не может быть добавлен в java.lang.Long весной Security ACL
@PostFilter("hasPermission(filterObject, read) or hasPermission(filterObject, admin)")
List<Company> list(Map params = [:]) {
return Company.list(params)
}
Я дал разрешение администратору на компанию. Когда я обращаюсь к вышеуказанному методу, все работает нормально. Проблема возникает, когда я остановил сервер и сделаю 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: тест
- Grails дБмВт-обновление
- Grails выполнения приложения
- http://localhost:8080/test2/home/list
- Вход с пользователем: администратор PopWrap: администратор
- 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 чистые
- Grails выполнения приложения
- http://localhost:8080/test2/home/list
Редактировать: Я обнаружил, что когда я выключил свой сервер mysql и перезапустил его, ошибка исчезла. Это может быть связано с некоторыми проблемами кэширования.
Есть ли способ поймать эту ошибку, например, в случае, когда ACL не были установлены раньше?
Примечание: этот вопрос по-прежнему остается без ответа.
Я не понимаю новых шагов - сначала вы переходите к списку, когда нет компании, поэтому возвращается пустой список, затем вы создаете дважды (?) Компанию1.нормально, но вы не назначаете ACL, так как кажется, что у вас есть эта часть на методе addPerm, поэтому даже на этом этапе, если вы вернетесь в список, вы столкнетесь с проблемой. –
Я исправил эти шаги. Сожалею. Даже если вы вернетесь к списку и не имеете разрешений, он должен вернуть пустой список из-за фильтра. Не могли бы вы воспроизвести ошибку? – confile
выглядит как проблема с сохранением, для воспроизведения мне теперь понадобится mysql вместо H2; попытается установить это. если у вас нет разрешения, я буду ожидать ошибки, поскольку компания была сохранена. –