2015-07-23 2 views
0

Я использую 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 и перезапустил его, ошибка исчезла. Это может быть связано с некоторыми проблемами кэширования.

Есть ли способ поймать эту ошибку, например, в случае, когда ACL не были установлены раньше?

Примечание: этот вопрос по-прежнему остается без ответа.

+0

Я не понимаю новых шагов - сначала вы переходите к списку, когда нет компании, поэтому возвращается пустой список, затем вы создаете дважды (?) Компанию1.нормально, но вы не назначаете ACL, так как кажется, что у вас есть эта часть на методе addPerm, поэтому даже на этом этапе, если вы вернетесь в список, вы столкнетесь с проблемой. –

+0

Я исправил эти шаги. Сожалею. Даже если вы вернетесь к списку и не имеете разрешений, он должен вернуть пустой список из-за фильтра. Не могли бы вы воспроизвести ошибку? – confile

+0

выглядит как проблема с сохранением, для воспроизведения мне теперь понадобится mysql вместо H2; попытается установить это. если у вас нет разрешения, я буду ожидать ошибки, поскольку компания была сохранена. –

ответ

1

Проблема, по-видимому, связана с тем, как AclSid переопределяет один в плагине.

Вы увидите сообщение java.lang.String cannot be cast to java.lang.Long, когда класс плагинов каким-то образом выиграл.

Существует легко исправить в общем, вы всегда должны быть запущены grails package после вы делаете grails clean также вы должны убедиться, что на вашем сервере či запуска package шага, прежде чем строить свою войну.

Я видел эту же проблему, так как мы используем UUID и должен был сделать класс AclSid строкой для sid. У меня не было проблем на производстве или локально, как только мы начали правильно запускать шаг пакета.

+0

Позвольте мне проверить это. У вас есть идея, почему eclipse сообщает об этой ошибке: http://stackoverflow.com/questions/31585864/spring-security-acl-domains-error-the-type-xxx-is-already-defined – confile

+0

Итак, на моем производственном сервере вы предлагаете запустить: 1) '' grails clean'', 2) '' grails prod package'' 3) '' grails prod war''. Что-то здесь отсутствует? – confile

+0

grails clean; пакет grails; война Грайля; все должно быть в порядке. Не нужно добавлять prod. –