/ / PreAuthorized ("hasRole ()") zawsze zwraca wartość false po aktualizacji zabezpieczeń sprężyny z wersji 3.2 do 4.0.2 - wiosna, wiosna - bezpieczeństwo

PreAuthorized ("hasRole ()") zawsze zwraca false po aktualizacji bezpieczeństwa wiosny z wersji 3.2 do 4.0.2 - wiosna, wiosna-bezpieczeństwo

Po aktualizacji zabezpieczeń sprężynowych do wersji 4.0.2 z wersji 3.2.x, jestem w stanie zalogować się do aplikacji internetowej, ale dostaję odmowę dostępu, jeśli próbuje uzyskać dostęp do metody, która ma @PreAuthorized (hasRole ()).

Próbowałem wprowadzić "ROLE_" na listę GrantAuthorities, ale wynik jest taki sam.

Ta sama konfiguracja działa dobrze w wersji 3.2.x. Czy ktoś może mieć pojęcie, co zrobiłem źle?

Dzięki

plik security-context.xml

<http pattern="/css/**" security="none" />
<http pattern="/Images/**" security="none" />
<http pattern="/javascript/**" security="none" />

<http auto-config="true" use-expressions="true" create-session="always"
authentication-manager-ref="tunAuthenticationManager">
<csrf disabled="true" />

<intercept-url pattern="/new/**"
access="hasRole("eu_rw") or hasRole("sp_rw")" />
<intercept-url pattern="/ajax/**"
access="hasRole("eu_rw") or hasRole("sp_rw")" />
<intercept-url pattern="/v2/**"
access="hasRole("eu_rw") or hasRole("sp_rw")" />

<intercept-url pattern="/monitoring" access="hasRole("sp_rw")" />
<intercept-url pattern="/monitoring/**" access="hasRole("sp_rw")" />

<form-login login-page="/logon.jsp" username-parameter="username"
password-parameter="password" login-processing-url="/j_spring_security_check"
authentication-failure-url="/logon.jsp?login_error=1"
default-target-url="/" always-use-default-target="true" />

<custom-filter position="FIRST" ref="logoutFilter" />
<custom-filter after="FIRST" ref="requestLoggingFilter" />
<custom-filter after="LAST" ref="passwordExpirationCheckFilter" />
<custom-filter after="SWITCH_USER_FILTER" ref="authorizationAdjustmentFilter" />
<custom-filter after="EXCEPTION_TRANSLATION_FILTER" ref="ajaxTimeoutRedirectFilter" />
</http>



<authentication-manager id="tunAuthenticationManager">
<authentication-provider ref="strongDaoAuthenticationProviderProxy" />
<authentication-provider ref="tunAdAuthenticationProvider" />
</authentication-manager>

<beans:bean id="strongDaoAuthenticationProviderProxy"
class="local.company.tun.security.DaoAuthenticationProviderProxy">
<beans:constructor-arg>
<beans:bean id="strongDaoAuthenticationProvider"
class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
<beans:property name="userDetailsService" ref="jdbcUserDetailsService" />
<beans:property name="passwordEncoder" ref="strongEncoder" />
<beans:property name="saltSource" ref="saltSource" />
</beans:bean>
</beans:constructor-arg>
</beans:bean>
<beans:bean id="jdbcUserDetailsService"
class="local.company.tun.security.tunUserDetailsService">
</beans:bean>
<beans:bean id="authenticationService"
class="local.company.tun.security.service.impl.AuthenticationServiceImpl">
<beans:qualifier value="authenticationService" />
<beans:property name="authenticationManager" ref="tunAuthenticationManager" />
</beans:bean>
<beans:bean
class="local.company.tun.security.DefaultRolesPrefixPostProcessor" />

servlet-context.xml

<mvc:interceptors>
<!-- Changes the locale when a "locale" request parameter is sent;
e.g. /?locale=de -->
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor" />
</mvc:interceptors>

<!-- Activate scanning of @Autowired -->
<context:annotation-config />
<!-- Spring Security - enable pre- post- annotations on Spring managed
MVC components -->
<bean id="expressionHandler" class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler" >

</bean>
<security:global-method-security pre-post-annotations="enabled">
<security:expression-handler ref="expressionHandler" />
</security:global-method-security>

....

Odpowiedzi:

1 dla odpowiedzi № 1

Musisz użyć ROLE_ przedrostek w nazwach ról i to samo w GrantedAuthorities w przeciwnym razie nie zadziała, chyba że ustawisz prefiks jako pusty.

RoleVoter.setRolePrefix("");


@PreAuthorize("hasRole("ROLE_ADMIN")")

new SimpleGrantedAuthority("ROLE_ADMIN")

Istnieje również pomysł na debugowanie. Umieść punkt przerwania w metodzie userDetails.getAuthorities (). Następnie uzyskaj dostęp do chronionego zasobu. Wiosna sprawdzi rzeczywistą wersję władz i zostanie złapana. Przejdź przez ślad stosu i znajdź miejsce i wartości, które są porównywane, sprawdzając, co dzieje się źle.


1 dla odpowiedzi nr 2

Jestem w stanie rozwiązać problem, dodając

<beans:bean
class="local.company.tun.security.DefaultRolesPrefixPostProcessor" />

do security-context.xml i kontekstu serwletu.xml. Wygląda na to, że jest potrzebny w obu miejscach. komponent bean w pliku security-context.xml uniemożliwi dodanie "ROLE_" do pliku komponent bean w pliku servlet-context.xml uniemożliwi dodanie "ROLE_" do pliku poziom metody.

dla odniesienia plik DefaultRolePrefixPostProcessor.java jest kopiowany z 3 migracji źródłowej 3 -> 4. Tutaj jest kod źródłowy tylko dla kompletności.

public class DefaultRolesPrefixPostProcessor implementuje BeanPostProcessor, PriorityOrdered {

@Override
public Object postProcessAfterInitialization(Object bean, String beanName)
throws BeansException {

Logger logger = LoggerFactory.getLogger(DefaultRolesPrefixPostProcessor.class);
// remove this if you are not using JSR-250
if(bean instanceof Jsr250MethodSecurityMetadataSource) {
((Jsr250MethodSecurityMetadataSource) bean).setDefaultRolePrefix(null);
}

if(bean instanceof DefaultMethodSecurityExpressionHandler) {
logger.info("overriding the default Role prefix. set it to null ");
((DefaultMethodSecurityExpressionHandler) bean).setDefaultRolePrefix(null);
}
if(bean instanceof DefaultWebSecurityExpressionHandler) {
((DefaultWebSecurityExpressionHandler) bean).setDefaultRolePrefix(null);
}
if(bean instanceof SecurityContextHolderAwareRequestFilter) {
((SecurityContextHolderAwareRequestFilter)bean).setRolePrefix("");
}
return bean;
}

@Override
public Object postProcessBeforeInitialization(Object bean, String beanName)
throws BeansException {
return bean;
}

@Override
public int getOrder() {
return PriorityOrdered.HIGHEST_PRECEDENCE;
}

}