/ / PreAuthorized ("hasRole ()") gibt immer false zurück, nachdem die Federsicherung von 3.2 auf 4.0.2 aktualisiert wurde - Feder, Federsicherheit

PreAuthorized ("hasRole ()") gibt immer false zurück, nachdem die Federsicherung von 3.2 auf 4.0.2 aktualisiert wurde - Feder, Federsicherheit

Nachdem ich Spring-Security auf Version 4.0 aktualisiert habe.2 von Version 3.2.x kann ich mich in der Webanwendung anmelden, aber ich bekomme den Zugriff verweigert, wenn er versucht, auf eine Methode zuzugreifen, die @PreAuthorized (hasRole ()) hat.

Ich habe versucht, "ROLE_" in die GrantAuthorities-Liste zu injizieren, aber das Ergebnis ist das gleiche.

Die gleiche Konfiguration funktioniert in Version 3.2.x. Kann jemand eine Idee haben, was habe ich falsch gemacht?

Vielen Dank

die Datei 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>

....

Antworten:

1 für die Antwort № 1

Sie müssen verwenden ROLE_ Präfix in Rollennamen und das gleiche in GrantedAuthorities andernfalls wird es nicht funktionieren, es sei denn, Sie haben das Präfix als leer gesetzt.

RoleVoter.setRolePrefix("");


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

new SimpleGrantedAuthority("ROLE_ADMIN")

Es gibt auch eine Idee, wie man debuggt. Fügen Sie in der Methode userDetails.getAuthorities () einen Unterbrechungspunkt ein. Greifen Sie dann auf die geschützte Ressource zu. Der Frühling wird die tatsächliche Version der Behörden überprüfen und wird gefangen werden. Gehe durch den Stack-Trace und finde den Ort und die Werte, die verglichen werden, um herauszufinden, was falsch läuft.


1 für die Antwort № 2

Ich kann das Problem lösen, indem ich ein

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

zu security-context.xml und dem Servlet-Kontext.XML. Es sieht so aus, als ob es für beide Orte benötigt wird. Die Bean in der Datei security-context.xml verhindert das Hinzufügen von "ROLE_" zum Die Bean in der servlet-context.xml verhindert das Hinzufügen von "ROLE_" zum Methodenebene.

Für die Referenz ist die DefaultRolePrefixPostProcessor.java Kopie aus der Frühjahrssicherheitsmigration 3 -> 4. Hier ist der Quellcode nur für die Vollständigkeit.

Die öffentliche Klasse DefaultRolesPrefixPostProcessor implementiert 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;
}

}