PreAuthorize не работает
Я пишу приложение для сокет-сервера (без веб-приложения!) И хочу использовать защиту на основе методов для удовлетворения моих потребностей в ACL. я последовал небольшой учебник я нашелвесенняя безопасность на примере
пока я настроил:
<code><security:global-method-security pre-post-annotations="enabled"> <security:expression-handler ref="expressionHandler" /> </security:global-method-security> <bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler"> <property name="permissionEvaluator"> <bean id="permissionEvaluator" class="myPermissionEvaluator" /> </property> </bean> <security:authentication-manager id="authenticationmanager"> <security:authentication-provider ref="authenticationprovider" /> </security:authentication-manager> <bean id="authenticationprovider" class="myAuthenticationProvider" /> </code>
С компонентом службы:
<code>@Named public class ChannelService { @PreAuthorize("isAuthenticated() and hasPermission(#channel, 'CHANNEL_WRITE')") public void writeMessage(Channel channel, String message) { ... } } </code>
Все компилируется и приложение запускается и работает нормально, но без контроля доступа. Мой журнал отладки показывает, что мой Evaluator никогда не вызывается.
Когда я попробовал нечто подобное с@Secured
аннотация аннотация была оценена, и в доступе было отказано. но простой безопасности на основе ролей недостаточно для моих требований.
EDIT сделал еще несколько тестов: когда я настраивал только безопасные аннотации = & quot; включен & quot; Ролевая безопасность работает. когда настраивать предварительные пост-аннотации = & quot; включено & quot; К тому же ни охраняемые, ни предварительно авторизованные работы. когда я настраиваю только предварительные аннотации, это все равно не работает.
EDIT2
еще несколько тестов: только с secured_annotations = & quot; включено & quot; вызов к моей службе канала проходит через Cglib2AopProxy как только я активирую предварительные аннотации, звонок попадает прямо в сервис канала. нет перехватчика, нет прокси, ничего.
Я в отчаянии ...
EDIT3
Я выполнил отладку своих тестов
только с защищенными аннотациями = & quot; включено & quot;
<code>2012-04-12 13:36:46,171 INFO [main] o.s.s.c.SpringSecurityCoreVersion - You are running with Spring Security Core 3.1.0.RELEASE 2012-04-12 13:36:46,174 INFO [main] o.s.s.c.SecurityNamespaceHandler - Spring Security 'config' module version is 3.1.0.RELEASE 2012-04-12 13:36:49,042 DEBUG [main] o.s.s.a.m.DelegatingMethodSecurityMetadataSource - Caching method [CacheKey[mystuff.UserService; public void mystuff.UserService.serverBan(java.lang.String,mystuff.models.User,org.joda.time.DateTime)]] with attributes [user] 2012-04-12 13:36:49,138 DEBUG [main] o.s.s.a.i.a.MethodSecurityInterceptor - Validated configuration attributes 2012-04-12 13:36:49,221 DEBUG [main] o.s.s.a.m.DelegatingMethodSecurityMetadataSource - Caching method [CacheKey[mystuff.ChannelService; public void mystuff.ChannelService.writeMessage(mystuff.models.Channel,java.lang.String)]] with attributes [blubb] 2012-04-12 13:36:51,159 DEBUG [main] o.s.s.a.ProviderManager - Authentication attempt using mystuff.GlobalchatAuthenticationProvider 2012-04-12 13:36:56,166 DEBUG [Timer-1] o.s.s.a.ProviderManager - Authentication attempt using mystuff.GlobalchatAuthenticationProvider 2012-04-12 13:36:56,183 DEBUG [Timer-1] o.s.s.a.i.a.MethodSecurityInterceptor - Secure object: ReflectiveMethodInvocation: public void mystuff.ChannelService.writeMessage(mystuff.models.Channel,java.lang.String); target is of class [mystuff.ChannelService]; Attributes: [blubb] 2012-04-12 13:36:56,184 DEBUG [Timer-1] o.s.s.a.i.a.MethodSecurityInterceptor - Previously Authenticated: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@312e8aef: Principal: mystuff.UserId@ced1752b; Credentials: [PROTECTED]; Authenticated: true; Details: null; Not granted any authorities Exception in thread "Timer-1" org.springframework.security.access.AccessDeniedException: Access is denied at org.springframework.security.access.vote.AbstractAccessDecisionManager.checkAllowIfAllAbstainDecisions(AbstractAccessDecisionManager.java:70) at org.springframework.security.access.vote.AffirmativeBased.decide(AffirmativeBased.java:88) at org.springframework.security.access.intercept.AbstractSecurityInterceptor.beforeInvocation(AbstractSecurityInterceptor.java:205) at org.springframework.security.access.intercept.aopalliance.MethodSecurityInterceptor.invoke(MethodSecurityInterceptor.java:59) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172) at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopProxy.java:622) at mystuff.ChannelService$$EnhancerByCGLIB$$3ad5e57f.writeMessage(<generated>) at mystuff.run(DataGenerator.java:109) at java.util.TimerThread.mainLoop(Timer.java:512) at java.util.TimerThread.run(Timer.java:462) 2012-04-12 13:36:56,185 DEBUG [Timer-1] o.s.s.access.vote.AffirmativeBased - Voter: org.springframework.security.access.vote.RoleVoter@1cfe174, returned: 0 2012-04-12 13:36:56,185 DEBUG [Timer-1] o.s.s.access.vote.AffirmativeBased - Voter: org.springframework.security.access.vote.AuthenticatedVoter@da89a7, returned: 0 </code>
с пред-пост-аннотациями = & quot; включено & quot;
<code>2012-04-12 13:39:54,926 INFO [main] o.s.s.c.SpringSecurityCoreVersion - You are running with Spring Security Core 3.1.0.RELEASE 2012-04-12 13:39:54,929 INFO [main] o.s.s.c.SecurityNamespaceHandler - Spring Security 'config' module version is 3.1.0.RELEASE 2012-04-12 13:39:54,989 INFO [main] o.s.s.c.m.GlobalMethodSecurityBeanDefinitionParser - Using bean 'expressionHandler' as method ExpressionHandler implementation 2012-04-12 13:39:59,812 DEBUG [main] o.s.s.a.ProviderManager - Authentication attempt mystuff.GlobalchatAuthenticationProvider 2012-04-12 13:39:59,850 DEBUG [main] o.s.s.a.i.a.MethodSecurityInterceptor - Validated configuration attributes </code>
Насколько я понимаю, эта пружина вывода журнала не понимает, что мои bean-компоненты должны быть проксированы, поэтому они не защищены, и поэтому я не получаю защиту.
EDIT4
Я отладил и запустил полный запуск спринта ... (вот один большой журнал), и там я нахожу:
<code>2012-04-12 14:40:41,385 INFO [main] o.s.c.s.ClassPathXmlApplicationContext - Bean 'channelService' of type [class mystuff.ChannelService] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying) </code>
Есть ли способ выяснить, почему? потому что, насколько я понимаю. из-за @preauthorize бин должен иметь право. только с защищенными аннотациями = & quot; включено & quot; я получаю журнал постобработки.