Я перезаписал BasicAuthenticationFilter и заменил его на наш фильтр, чтобы получить пользовательский объект аутентификации из БД и установить его с помощью
SecurityContextHolder.getContext().setAuthentication(auth);
Вот важная часть конфигурации безопасности:
<http use-expressions="true" entry-point-ref="authEntryPoint">
<custom-filter position="BASIC_AUTH_FILTER" ref="basicProcessingFilter" />
<intercept-url pattern="/**" access="hasRole('user')"/>
</http>
<beans:bean id="authEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
<beans:property name="loginFormUrl" value="/login"/>
</beans:bean>
<global-method-security jsr250-annotations="enabled"/>
Я также предоставляю свой собственный AuthenticationProvider, который просто запрещен, поскольку процесс аутентификации уже выполнен в пользовательском фильтре:
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
logger.info("user:" + authentication.getPrincipal() + " pw:" + authentication.getCredentials());
authentication.setAuthenticated(false);
return authentication;
}
@Override
public boolean supports(Class<? extends Object> authentication) {
return MyAuthentication.class.isAssignableFrom(authentication);
}
Теперь Spring правильно печатает нужные роли) для каждого метода при запуске, поэтому он правильно определяет аннотации.Например, роль администратора для метода удаления:
2011-11-22 11: 47: 09,474 [main] DEBUG org.springframework.security.access.method.DelegatingMethodSecurityMetadataSource - добавление метода безопасности [CacheKey [com.somecompany.SomeClass;public com.somecompany.ReturnType com.somecompany.SomeClass.delete ()]] с атрибутами [admin]
Но Spring как-то не проверяет, есть ли у пользователя эта роль. Вместо этого он падаетвернуться к глобальному шаблону, определенному в теге http XML-файла контекста безопасности.Так, например, если я получу доступ к этому методу удаления с пользователем ролей: ["user"], он примет его из-за hasRole ('user') в теге http.
Возможно, что-то не так, когдаинициализация объекта DefaultFilterInvocationSecurityMetadataSource, поскольку он не будет заполнен определенным правилом для метода удаления !?С помощью метода addSecureUrl добавляются только правила, определенные для тега http.
Что может быть не так?