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"/>

от весеннего контекста безопасности до контекста, в котором я "сканировал" классы (т.е. контекст моего приложения). Благодаря комментариям этого ответа

Другие вопросы по тегам