Spring Authorization через аннотации не работает с пользовательской аутентификацией
Я перезаписал 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, потому что он не будет заполнен определенным правилом для метода удаления!? Только определенные http-теги правила добавляются с помощью метода addSecureUrl.
Что может быть не так?
1 ответ
Перемещение
<global-method-security jsr250-annotations="enabled"/>
от весеннего контекста безопасности до контекста, в котором я "сканировал" классы (т.е. контекст моего приложения). Благодаря комментариям этого ответа