Spring Authorization через аннотации не работает с пользовательской аутентификацией - PullRequest
1 голос
/ 22 ноября 2011

Я перезаписал 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.

Что может быть не так?

1 Ответ

2 голосов
/ 22 ноября 2011

Перемещение

<global-method-security jsr250-annotations="enabled"/>

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

...