/ / पूर्व प्राधिकृत ("हैरोल ()") 3.2 से 4.0.2 तक वसंत सुरक्षा अपग्रेड के बाद हमेशा झूठी वापसी - वसंत, वसंत-सुरक्षा

पूर्व प्राधिकृत ("हैरोल ()") 3.2 से 4.0.2 तक वसंत सुरक्षा अपग्रेड के बाद हमेशा झूठी वापसी - वसंत, वसंत-सुरक्षा

मैंने स्प्रिंग-सुरक्षा को संस्करण 4.0 में अपग्रेड करने के बाद।संस्करण 3.2.x से 2, मैं वेब एप्लिकेशन में लॉगिन करने में सक्षम हूं, लेकिन अगर मैं @PreAuthorized (हैरोल ()) वाली किसी विधि तक पहुंचने का प्रयास करता हूं तो मुझे एक्सेस अस्वीकार कर दिया जाता है।

मैंने GrantAuthorities सूची में "ROLE_" इंजेक्ट करने का प्रयास किया है, लेकिन नतीजा वही है।

वही कॉन्फ़िगरेशन संस्करण 3.2.x में ठीक काम करता है। क्या किसी को पता है कि मैंने क्या गलत किया?

धन्यवाद

सुरक्षा-संदर्भ.एक्सएमएल

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

....

उत्तर:

उत्तर № 1 के लिए 1

तुम्हें अवश्य उपयोग करना चाहिए ROLE_ भूमिका नामों में उपसर्ग और उसी में GrantedAuthorities अन्यथा यह तब तक काम नहीं करता जब तक कि आपने उपसर्ग को खाली के रूप में सेट नहीं किया हो।

RoleVoter.setRolePrefix("");


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

new SimpleGrantedAuthority("ROLE_ADMIN")

डीबग करने का विचार भी है। उपयोगकर्ताDetails.getAuthorities () विधि में ब्रेक पॉइंट डालें। फिर संरक्षित संसाधन तक पहुंचें। वसंत अधिकारियों के वास्तविक संस्करण की जांच करेगा और पकड़ा जाएगा। स्टैक ट्रेस के माध्यम से जाएं और उस स्थान और मूल्यों को ढूंढें जो तुलनात्मक रूप से पता चल रहे हैं कि क्या गलत हो रहा है।


उत्तर № 2 के लिए 1

मैं एक जोड़कर इस मुद्दे को हल करने में सक्षम हूं

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

सुरक्षा-context.xml और सर्वलेट-संदर्भ के लिए।एक्सएमएल। ऐसा लगता है कि यह दोनों जगहों के लिए जरूरी है। सुरक्षा-context.xml में बीन "ROLE_" को जोड़ने से रोक देगा servlet-context.xml में बीन "ROLE_" को जोड़ने से रोक देगा विधि स्तर।

संदर्भ के लिए DefaultRolePrefixPostProcessor.java वसंत सुरक्षा माइग्रेशन 3 -> 4 से प्रतिलिपि है। पूर्णता के लिए केवल स्रोत कोड है।

पब्लिक क्लास DefaultRolesPrefixPostProcessor लागू करता है BeanPostProcessor, प्राथमिकताऑर्डर्ड {

@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;
}

}