2013-03-19 10 views
27

मैं सफल कक्षा पर ApplicationListener<AuthenticationSuccessEvent> इंटरफ़ेस लागू करने वाले वर्ग से संरक्षित विधि का आह्वान करने की कोशिश कर रहा हूं (वसंत 3.2.2 और वसंत सुरक्षा 3.2.0 एम 1) । This मेरा पिछला प्रश्न है।सुरक्षा कॉन्टेक्स्ट में एक प्रमाणीकरण ऑब्जेक्ट नहीं मिला - वसंत 3.2.2

एप्लिकेशन निम्न वातावरण के तहत चलता है।

  • वसंत 3.2.2
  • स्प्रिंग सुरक्षा 3.2.0
  • जेपीए 2.0
  • JSF 2.1.9
  • MySQL 5.6.11
  • JDK-7u11
  • NetBeans 7.2.1

मैंने निम्नलिखित पुस्तकालयों को जोड़ा है कक्षा के लिए वसंत सुरक्षा के लिए।

  • वसंत-सुरक्षा-कोर-3.2.0.M1.jar
  • वसंत-सुरक्षा-config-3.2.0.M1.jar
  • वसंत-सुरक्षा-वेब-3.2.0.M1। जार

वर्ग को लागू करने वाली ApplicationListener<AuthenticationSuccessEvent> इस प्रकार है।

package loginsuccesshandler; 

import admin.dao.service.StateService; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.ApplicationListener; 
import org.springframework.security.authentication.event.AuthenticationSuccessEvent; 
import org.springframework.stereotype.Service; 

@Service 
public final class AuthSuccessHandler implements ApplicationListener<AuthenticationSuccessEvent> 
{ 
    @Autowired 
    private StateService stateService; 

    @Override 
    public void onApplicationEvent(AuthenticationSuccessEvent event) 
    { 
     System.out.println(event.getAuthentication()); 
     System.out.println("rowCount = "+stateService.rowCount()); 
    } 
} 

यह भी निम्न संदेश के साथ सही पहचान के साथ में लॉग इन किया जा रहा से एक उपयोगकर्ता को रोकता है (यह सिर्फ एक उदाहरण है। सफल प्रमाणीकरण पर राज्यों की संख्या बिल्कुल जरूरी नहीं है गिनती)।

एक प्रमाणीकरण वस्तु SecurityContext


घटना उठाया है में

नहीं मिला था। onApplicationEvent() विधि के अंदर पहला कथन निम्नलिखित प्रदर्शित करता है।

org.springframew[email protected]45264a59: Principal: [email protected]:Username: admin; 
Password: [PROTECTED]; 
Enabled: true; 
AccountNonExpired: true; 
credentialsNonExpired: true; 
AccountNonLocked: true; 
Granted Authorities: ROLE_ADMIN; 
Credentials: [PROTECTED]; 
Authenticated: true; 
Details: org.sprin[email protected]380f4: RemoteIpAddress: 127.0.0.1; 
SessionId: 88777A678DC5BB0272F84CA4BC61FAF2; 
Granted Authorities: ROLE_ADMIN 

तो ऐसा लगता है कि उपयोगकर्ता प्रमाणीकृत है और प्रमाणीकरण वस्तु उपलब्ध है।


मेरी springSecurity.xml फ़ाइल बस निम्न की तरह दिखती है।

<?xml version="1.0" encoding="UTF-8"?> 
<beans:beans xmlns="http://www.springframework.org/schema/security" 
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
      http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
      http://www.springframework.org/schema/security 
      http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

    <http pattern="/utility/Login.jsf*" security="none"/> 
    <debug/> 
    <http auto-config='true' use-expressions="true" disable-url-rewriting="true"> 
     <session-management session-fixation-protection="newSession"> 
      <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" /> 
     </session-management> 

     <intercept-url pattern="/admin_side/**" access="hasRole('ROLE_ADMIN')" requires-channel="any"/> 
     <intercept-url pattern="/utility/Login.jsf" access="permitAll" requires-channel="any"/> 
     <http-basic /> 
     <anonymous /> 

     <form-login login-processing-url="/j_spring_security_check" login-page="/utility/Login.jsf" authentication-success-handler-ref="loginSuccessHandler" authentication-failure-handler-ref="authenticationFailureHandler"/> 
     <logout logout-success-url="/utility/Login.jsf" invalidate-session="true" delete-cookies="JSESSIONID"/> 
    </http> 

    <authentication-manager> 
     <authentication-provider> 
      <jdbc-user-service data-source-ref="dataSource" 
       users-by-username-query="select email_id, password, enabled from user_table where lower(email_id)=lower(?)" 
       authorities-by-username-query="select ut.email_id, ur.authority from user_table ut, user_roles ur where ut.user_id=ur.user_id and lower(ut.email_id)=lower(?)"/> 
     </authentication-provider> 
    </authentication-manager> 

    <beans:bean id="loginSuccessHandler" class="loginsuccesshandler.LoginSuccessHandler"/> 
    <beans:bean id="authenticationFailureHandler" class="loginsuccesshandler.AuthenticationFailureHandler" />   

    <global-method-security secured-annotations="enabled" pre-post-annotations="enabled" proxy-target-class="false"> 
     <protect-pointcut expression="execution(* admin.dao.*.*(..))" access="ROLE_ADMIN"/> 
    </global-method-security> 
</beans:beans> 

स्प्रिंग सुरक्षा ठीक काम करता है, जब XML के निम्नलिखित लाइनों spring-security.xml फ़ाइल से छोड़ा गया है।

<global-method-security secured-annotations="enabled" proxy-target-class="false"> 
    <protect-pointcut expression="execution(* admin.dao.*.*(..))" access="ROLE_ADMIN"/> 
</global-method-security> 

एक संरक्षित विधि (विधि सुरक्षा के साथ लागू) एक वर्ग ApplicationListener<AuthenticationSuccessEvent> इंटरफेस को लागू करने से लागू किया जा सकता है? यदि हां, तो मेरे मामले में क्या गुम है? मैंने अभी तक हजारों लिंक पर क्लिक किया है लेकिन एक सुराग नहीं मिला।


application-context.xml फ़ाइल।

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     xmlns:p="http://www.springframework.org/schema/p" 
     xmlns:aop="http://www.springframework.org/schema/aop" 
     xmlns:tx="http://www.springframework.org/schema/tx" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:jee="http://www.springframework.org/schema/jee" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd 
     http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd 
     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> 

    <context:component-scan base-package="admin.mangedbean loginsuccesshandler" use-default-filters="false"> 
     <context:include-filter expression="org.springframework.stereotype.Controller" type="annotation"/> 
     <context:include-filter expression="org.springframework.web.bind.annotation.ControllerAdvice" type="annotation"/> 
    </context:component-scan> 

    <mvc:annotation-driven/> 
    <context:annotation-config/> 

    <bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor"/>    

    <bean class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean" id="entityManagerFactory" > 
     <property name="jpaProperties"> 
      <props> 
       <prop key="hibernate.enable_lazy_load_no_trans">true</prop> 
      </props> 
     </property> 

     <property name="jpaPropertyMap"> 
      <map> 
       <entry key="eclipselink.weaving" value="false"/> 
      </map> 
     </property> 

     <property name="loadTimeWeaver"> 
      <bean class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/> 
     </property> 
    </bean> 

    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
     <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    </bean> 

    <tx:annotation-driven transaction-manager="transactionManager"/> 

    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
     <property name="jndiName" value="java:comp/env/jdbc/social_networking"/> 
    </bean> 

    <!--The bean shown in the beginning is configured here--> 
    <bean id="authSuccessHandler" class="loginsuccesshandler.AuthSuccessHandler"/> 

    <bean id="testService" class="admin.dao.TestDAO"/> 
    <bean id="stateService" class="admin.dao.StateDAO"/> 
    <bean id="sharableService" class="admin.dao.SharableDAO"/> 
</beans> 

web.xml फ़ाइल।

<?xml version="1.0" encoding="UTF-8"?> 
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">   

    <context-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      /WEB-INF/applicationContext.xml 
      /WEB-INF/spring-security.xml 
     </param-value> 
    </context-param> 

    <context-param> 
     <param-name>javax.faces.PROJECT_STAGE</param-name> 
     <!--<param-value>Development</param-value>--> 
     <param-value>Production</param-value> 
    </context-param> 

    <context-param> 
     <param-name>log4jConfigLocation</param-name> 
     <param-value>/WEB-INF/log4j.properties</param-value> 
    </context-param> 

    <context-param> 
     <param-name>log4jExposeWebAppRoot</param-name> 
     <param-value>false</param-value> 
    </context-param> 

    <filter> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class> 
    </filter> 

    <filter-mapping> 
     <filter-name>springSecurityFilterChain</filter-name> 
     <url-pattern>/*</url-pattern> 
     <dispatcher>REQUEST</dispatcher> 
     <dispatcher>FORWARD</dispatcher> 
    </filter-mapping> 

    <listener> 
     <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
    </listener> 

    <listener> 
     <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class> 
    </listener>   

    <listener> 
     <listener-class>org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> 
    </listener> 

    <listener> 
     <listener-class>org.springframework.web.util.Log4jConfigListener</listener-class> 
    </listener> 

    <servlet> 
     <servlet-name>Faces Servlet</servlet-name> 
     <servlet-class>javax.faces.webapp.FacesServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 

    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.jsf</url-pattern> 
    </servlet-mapping> 

    <servlet-mapping> 
     <servlet-name>Faces Servlet</servlet-name> 
     <url-pattern>*.xhtml</url-pattern> 
    </servlet-mapping> 

    <security-constraint> 
     <display-name>Restrict direct access to XHTML files</display-name> 
     <web-resource-collection> 
      <web-resource-name>XHTML files</web-resource-name> 
      <url-pattern>*.xhtml</url-pattern> 
     </web-resource-collection> 
     <auth-constraint /> 
    </security-constraint> 

    <session-config> 
     <session-timeout> 
      120 
     </session-timeout> 
    </session-config> 
    <welcome-file-list> 
     <welcome-file>/utility/Login.jsf</welcome-file> 
    </welcome-file-list> 

    <resource-ref> 
     <res-ref-name>jdbc/social_networking</res-ref-name> 
     <res-type>javax.sql.DataSource</res-type> 
     <res-auth>Container</res-auth> 
    </resource-ref> 
</web-app> 

डिबग जानकारी के लिए, नीचे देखा जा सकता है जब एक प्रयास लॉगइन करने के लिए जो अंततः विफल रहता किया जाता है।

DEBUG [http-apr-8080-exec-55] (AntPathRequestMatcher.java:116) - Checking match of request : '/j_spring_security_check'; against '/utility/login.jsf*' 
DEBUG [http-apr-8080-exec-55] (AntPathRequestMatcher.java:116) - Checking match of request : '/j_spring_security_check'; against '/utility/login.jsf*' 
DEBUG [http-apr-8080-exec-55] (FilterChainProxy.java:337) - /j_spring_security_check at position 1 of 13 in additional filter chain; firing Filter: 'ChannelProcessingFilter' 
DEBUG [http-apr-8080-exec-55] (AntPathRequestMatcher.java:116) - Checking match of request : '/j_spring_security_check'; against '/admin_side/**' 
DEBUG [http-apr-8080-exec-55] (AntPathRequestMatcher.java:116) - Checking match of request : '/j_spring_security_check'; against '/utility/login.jsf' 
DEBUG [http-apr-8080-exec-55] (FilterChainProxy.java:337) - /j_spring_security_check at position 2 of 13 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter' 
DEBUG [http-apr-8080-exec-55] (HttpSessionSecurityContextRepository.java:139) - HttpSession returned null object for SPRING_SECURITY_CONTEXT 
DEBUG [http-apr-8080-exec-55] (HttpSessionSecurityContextRepository.java:85) - No SecurityContext was available from the HttpSession: [email protected] A new one will be created. 
DEBUG [http-apr-8080-exec-55] (FilterChainProxy.java:337) - /j_spring_security_check at position 3 of 13 in additional filter chain; firing Filter: 'ConcurrentSessionFilter' 
DEBUG [http-apr-8080-exec-55] (FilterChainProxy.java:337) - /j_spring_security_check at position 4 of 13 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter' 
DEBUG [http-apr-8080-exec-55] (FilterChainProxy.java:337) - /j_spring_security_check at position 5 of 13 in additional filter chain; firing Filter: 'LogoutFilter' 
DEBUG [http-apr-8080-exec-55] (FilterChainProxy.java:337) - /j_spring_security_check at position 6 of 13 in additional filter chain; firing Filter: 'UsernamePasswordAuthenticationFilter' 
DEBUG [http-apr-8080-exec-55] (AbstractAuthenticationProcessingFilter.java:189) - Request is to process authentication 
DEBUG [http-apr-8080-exec-55] (ProviderManager.java:152) - Authentication attempt using org.springframework.security.authentication.dao.DaoAuthenticationProvider 
DEBUG [http-apr-8080-exec-55] (JdbcTemplate.java:637) - Executing prepared SQL query 
DEBUG [http-apr-8080-exec-55] (JdbcTemplate.java:572) - Executing prepared SQL statement [select email_id, password, enabled from user_table where lower(email_id)=lower(?)] 
DEBUG [http-apr-8080-exec-55] (DataSourceUtils.java:110) - Fetching JDBC Connection from DataSource 
DEBUG [http-apr-8080-exec-55] (DataSourceUtils.java:327) - Returning JDBC Connection to DataSource 
DEBUG [http-apr-8080-exec-55] (JdbcTemplate.java:637) - Executing prepared SQL query 
DEBUG [http-apr-8080-exec-55] (JdbcTemplate.java:572) - Executing prepared SQL statement [select ut.email_id, ur.authority from user_table ut, user_roles ur where ut.user_id=ur.user_id and lower(ut.email_id)=lower(?)] 
DEBUG [http-apr-8080-exec-55] (DataSourceUtils.java:110) - Fetching JDBC Connection from DataSource 
DEBUG [http-apr-8080-exec-55] (DataSourceUtils.java:327) - Returning JDBC Connection to DataSource 
DEBUG [http-apr-8080-exec-55] (AbstractBeanFactory.java:246) - Returning cached instance of singleton bean 'authSuccessHandler' 
DEBUG [http-apr-8080-exec-55] (AbstractBeanFactory.java:246) - Returning cached instance of singleton bean 'org.springframework.security.core.session.SessionRegistryImpl#0' 
DEBUG [http-apr-8080-exec-55] (AbstractFallbackTransactionAttributeSource.java:106) - Adding transactional method 'rowCount' with attribute: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; '' 
DEBUG [http-apr-8080-exec-55] (DelegatingMethodSecurityMetadataSource.java:65) - Caching method [CacheKey[admin.dao.StateDAO; public abstract java.lang.Long admin.dao.service.StateService.rowCount()]] with attributes [ROLE_ADMIN] 
DEBUG [http-apr-8080-exec-55] (AbstractBeanFactory.java:246) - Returning cached instance of singleton bean 'transactionManager' 
DEBUG [http-apr-8080-exec-55] (AbstractPlatformTransactionManager.java:366) - Creating new transaction with name [admin.dao.StateDAO.rowCount]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT,readOnly; '' 
DEBUG [http-apr-8080-exec-55] (JpaTransactionManager.java:369) - Opened new EntityManager [[email protected]] for JPA transaction 
DEBUG [http-apr-8080-exec-55] (JpaTransactionManager.java:408) - Not exposing JPA transaction [[email protected]] as JDBC transaction because JpaDialect [[email protected]] does not support JDBC Connection retrieval 
DEBUG [http-apr-8080-exec-55] (AbstractSecurityInterceptor.java:194) - Secure object: ReflectiveMethodInvocation: public abstract java.lang.Long admin.dao.service.StateService.rowCount(); target is of class [admin.dao.StateDAO]; Attributes: [ROLE_ADMIN] 
DEBUG [http-apr-8080-exec-55] (AbstractBeanFactory.java:246) - Returning cached instance of singleton bean 'authSuccessHandler' 
DEBUG [http-apr-8080-exec-55] (AbstractBeanFactory.java:246) - Returning cached instance of singleton bean 'org.springframework.security.core.session.SessionRegistryImpl#0' 
DEBUG [http-apr-8080-exec-55] (AbstractPlatformTransactionManager.java:844) - Initiating transaction rollback 
DEBUG [http-apr-8080-exec-55] (JpaTransactionManager.java:534) - Rolling back JPA transaction on EntityManager [[email protected]] 
DEBUG [http-apr-8080-exec-55] (JpaTransactionManager.java:594) - Closing JPA EntityManager [[email protected]] after transaction 
DEBUG [http-apr-8080-exec-55] (EntityManagerFactoryUtils.java:338) - Closing JPA EntityManager 
DEBUG [http-apr-8080-exec-55] (AbstractAuthenticationProcessingFilter.java:346) - Authentication request failed: org.springframework.security.authentication.AuthenticationCredentialsNotFoundException: An Authentication object was not found in the SecurityContext 
DEBUG [http-apr-8080-exec-55] (AbstractAuthenticationProcessingFilter.java:347) - Updated SecurityContextHolder to contain null Authentication 
DEBUG [http-apr-8080-exec-55] (AbstractAuthenticationProcessingFilter.java:348) - Delegating to authentication failure handler [email protected] 
DEBUG [http-apr-8080-exec-55] (DefaultRedirectStrategy.java:36) - Redirecting to '/SocialNetworking/utility/Login.jsf' 
DEBUG [http-apr-8080-exec-55] (HttpSessionSecurityContextRepository.java:269) - SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession. 
DEBUG [http-apr-8080-exec-55] (SecurityContextPersistenceFilter.java:97) - SecurityContextHolder now cleared, as request processing completed 
DEBUG [http-apr-8080-exec-49] (AntPathRequestMatcher.java:116) - Checking match of request : '/utility/login.jsf'; against '/utility/login.jsf*' 
DEBUG [http-apr-8080-exec-49] (AntPathRequestMatcher.java:116) - Checking match of request : '/utility/login.jsf'; against '/utility/login.jsf*' 
DEBUG [http-apr-8080-exec-49] (FilterChainProxy.java:180) - /utility/Login.jsf has an empty filter list 

आखिरी बात:

जब मैं इस सेम छोड़ देना और application-context.xml फ़ाइल से अपंजीकृत, लॉगिन सफलतापूर्वक किया जाता है, लेकिन निम्न जानकारी सर्वर कंसोल पर देखा जा सकता है।

DEBUG [http-apr-8080-exec-165] (HttpSessionSecurityContextRepository.java:139) - HttpSession returned null object for SPRING_SECURITY_CONTEXT 
DEBUG [http-apr-8080-exec-165] (HttpSessionSecurityContextRepository.java:85) - No SecurityContext was available from the HttpSession: [email protected] A new one will be created. 
+0

क्या आप उपयोगकर्ता Sevice.getUser (userName) विधि का कोड दिखा सकते हैं? क्या आप पूर्ण अपवाद स्टैक ट्रेस पोस्ट कर सकते हैं? –

+0

@ मैक्सिम डेमिडास - वह विधि पोस्ट की गई है। अपवाद वसंत द्वारा खाया जाता है और इसलिए पूर्ण उत्तेजना स्टैकट्रैक उपलब्ध नहीं है। यह संदेश - 'सत्रस्कोप ["SPRING_SECURITY_LAST_EXCEPTION"] के माध्यम से है। संदेश'। मुझे नहीं पता कि पूर्ण अपवाद स्टैकट्रैक कैसे प्रदर्शित करें। – Tiny

+0

मुझे कुछ भी गलत नहीं दिख रहा है। ऐसा लगता है कि कुछ लोगों द्वारा सुरक्षा संदर्भ को मंजूरी दे दी गई थी। मुझे और जानने के लिए दो विकल्प दिखाई देते हैं: 1) org.springframework.security पैकेज के लिए डीबग लॉगिंग को सक्रिय करें 2) सुरक्षाकोनक्सहोल्डर क्लास में ब्रेकपॉइंट बनाएं (उदाहरण के लिए SecurityContextHolder.clearContext() विधि में)। उम्मीद है की यह मदद करेगा। –

उत्तर

20

सुरक्षा के प्राधिकरण की जांच हिस्सा SecurityContext से प्रमाणीकृत वस्तु हो जाता है, जो जब एक अनुरोध वसंत सुरक्षा फिल्टर के माध्यम से हो जाता है स्थापित किया जाएगा। मेरी धारणा यह है कि लॉगिन के तुरंत बाद यह सेट नहीं किया जा रहा है। आप मूल्य सेट करने के लिए नीचे दिए गए अनुसार एक हैक का उपयोग कर सकते हैं।

try { 
    SecurityContext ctx = SecurityContextHolder.createEmptyContext(); 
    SecurityContextHolder.setContext(ctx); 
    ctx.setAuthentication(event.getAuthentication()); 

    //Do what ever you want to do 

} finally { 
    SecurityContextHolder.clearContext(); 
} 

अद्यतन:

इसके अलावा, आप InteractiveAuthenticationSuccessEvent जो एक बार SecurityContext सेट किया गया है बुलाया जाएगा पर एक नज़र हो सकता है।

+0

हां, यह वास्तव में काम करता है लेकिन मुझे हमेशा संदेह है कि मेरे आवेदन में विशेष रूप से स्प्रिंग सिक्योरिटी में कुछ गड़बड़ होनी चाहिए। धन्यवाद। : डी – Tiny

+0

यदि आप भविष्य में कुछ और देखते हैं, तो कृपया मुझे यहां बताने के लिए मत भूलना क्योंकि मेरे प्रयास समाप्त हो गए हैं और मुझे कुछ भी गलत नहीं दिख रहा है। धन्यवाद। – Tiny

+0

@Tiny यकीन है, क्या यह समस्या का समाधान किया? –

3

जैसा कि पहले से ही @ अरुण पी जॉनी द्वारा इंगित किया गया है, समस्या का मूल कारण यह है कि उस समय AuthenticationSuccessEvent संसाधित किया गया है SecurityContextHolder प्रमाणीकरण ऑब्जेक्ट द्वारा पॉप्युलेट नहीं किया गया है। तो कोई भी घोषणात्मक प्राधिकरण जांच (जिसे SecurityContextHolder से उपयोगकर्ता अधिकार प्राप्त करना चाहिए) काम नहीं करेगा। मैं आपको एक और विचार देता हूं कि इस समस्या को कैसे हल किया जाए।

  1. AuthenticationSuccessEvent
  2. को सुनें अपने कस्टम AuthenticationSuccessHandler कार्यान्वयन प्रदान करें: दो तरीके है कि कैसे आप तुरंत सफल प्रमाणीकरण के बाद अपने कस्टम कोड चला सकते हैं कर रहे हैं।

AuthenticationSuccessHandler पहले तरीके से एक महत्वपूर्ण लाभ है: SecurityContextHolder पहले ही पॉप्युलेट हो जाएगा। तो बस अपने stateService.rowCount() को loginsuccesshandler.LoginSuccessHandler#onAuthenticationSuccess(...) विधि में कॉल करें और समस्या दूर हो जाएगी।

+0

'प्रमाणीकरण SUccessHandler' के साथ, यह काम करता है लेकिन मुझे संदेह है, मेरी विन्यास में कुछ ऐसा है जो पर्याप्त रूप से भरोसा नहीं किया जा सकता है। धन्यवाद। : डी – Tiny

3

इसी तरह की समस्या है। के रूप में यहाँ दी

https://stackoverflow.com/questions/3145936/spring-security-j-spring-security-logout-problem

यह मेरे web.xml को लाइनों के नीचे जोड़ने के लिए काम किया मैं श्रोता गयी। इसे बहुत देर से पोस्ट करना, किसी को उत्तर की तलाश में मदद करनी चाहिए।

<listener> 
    <listener-class> org.springframework.security.web.session.HttpSessionEventPublisher</listener-class> 
</listener> 
+1

क्या आप इस श्रोता के बारे में बात कर रहे हैं, 'org.springframework.security.web.session.HttpSessionEventPublisher'? मेरे पास इस श्रोता को 'web.xml' में भी बताया गया है जैसा कि प्रश्न में दिखाया गया है। उस स्थिति में, यदि आप कर सकते हैं, तो उत्तर में अपना स्वयं का समाधान जोड़ना बेहतर होगा। उत्तर के लिए धन्यवाद :) – Tiny

+0

@ टिनी राइट। संपादित पोस्ट – Mallik

0

मेरे लिए, समस्या एक ContextRefreshedEvent हैंडलर थी। मैं कुछ डेटा initilization कर रहा था लेकिन आवेदन में उस बिंदु पर प्रमाणीकरण सेट नहीं किया गया था।यह एक पकड़ 22 था क्योंकि सिस्टम को प्रमाणीकरण के लिए प्रमाणीकरण की आवश्यकता थी और प्रमाणीकरण विवरण प्राप्त करने के लिए प्राधिकरण की आवश्यकता थी :)। मैंने कक्षा स्तर से प्राधिकरण को विधि स्तर पर प्राधिकृत करना समाप्त कर दिया।

संबंधित मुद्दे