Ich schreibe eine Socket-Server-Anwendung (keine Web-Anwendung!) Und möchte Methoden-basierte Sicherheit verwenden, um meine ACL-Anforderungen zu behandeln. Ich folgte ein kleines Tutorial i spring security by examplePreAuthorize funktioniert nicht
bisher gefunden i konfiguriert:
<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" />
Mit einem Service-Bean:
@Named
public class ChannelService {
@PreAuthorize("isAuthenticated() and hasPermission(#channel, 'CHANNEL_WRITE')")
public void writeMessage(Channel channel, String message) { ... }
}
Alles kompiliert und die Anwendung gestartet und funktioniert gut, aber ohne Zugriffskontrolle . Mein Debugprotokoll zeigt, dass mein Evaluator nie aufgerufen wird.
Wenn ich etwas Ähnliches mit einer @Secured
Annotation versuchte, wurde die Annotation ausgewertet und der Zugriff verweigert. aber einfache rollenbasierte Sicherheit ist nicht genug für meine Anforderungen.
BEARBEITEN habe noch einige Tests durchgeführt: Wenn ich nur secured-annotations = "enabled" konfiguriere, funktioniert die rollenbasierte Sicherheit. Wenn pre-post-annotations = "enabled" in ADDITION konfiguriert wird, funktioniert weder die Sicherung noch die Vorautorisierung. Wenn ich nur Pre-Post-Annotationen konfiguriere, funktioniert es immer noch nicht.
EDIT2
einige weitere Tests: mit nur secured_annotations = „freigegeben“ der Aufruf an meine Channel geht durch die Cglib2AopProxy sobald ich den Anruf landet direkt in der Channel Prä-Post-Annotationen aktivieren . kein Abfangjäger, kein Proxy, nichts.
Ich erhalte Art verzweifelter ...
EDIT3
Debug-logged meine Testfahrt hier ist der Teil für feder Sicherheit
mit nur gesicherten Anmerkungen =“ enabled“
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.springframew[email protected]312e8aef: Principal: [email protected]; 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: [email protected], returned: 0
2012-04-12 13:36:56,185 DEBUG [Timer-1] o.s.s.access.vote.AffirmativeBased - Voter: [email protected]a7, returned: 0
mit Prä-Post-Anmerkungen = "freigegeben"
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
Soweit ich verstehe, merkt diese Protokollausgabefeder nicht, dass meine Bohnen proxied sein müssen, also sind sie nicht und so bekomme ich Sicherheit nicht.
Edit4
ich die komplette Sprint Start Debug-logged ... (das ist ein großer Log) und dort finden i:
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)
ist es eine Möglichkeit, um herauszufinden, warum? weil, soweit ich es verstehe. wegen @preauthorize sollte die Bean berechtigt sein. mit nur secured-annotations = "enabled" erhalte ich ein Nachbearbeitungsprotokoll.
Welche Version von Spring und Spring Security verwenden Sie? – Roadrunner
@Roadrunner Feder 3.1.0.RELEASE auf alles. – Laures
Können Sie debuggen, wenn "PrePostAnnotationSecurityMetadataSource # getAttributes()" für Ihre Methode aufgerufen wird, wenn Spring initialisiert? – Luciano