2016-09-28 4 views
0

Ich habe ein Problem mit meiner Sicherheits-XML-Konfiguration. Ich bin nicht in der Lage für die lokale Login der Benutzername und das Passwort von Anmeldungsformular zu gelangen (Sozial Login funktioniert)Mehrere Authentifizierungsanbieter:/j_spring_security_check und soziale Anmeldung

In sehr kurz: Wenn der Benutzer das Anmeldeformular einreicht, das erste Auftreten in meinen Code ist in UserDetailService

public SpringSecurityLocalUser loadUserByUsername(final String userId) throws UsernameNotFoundException 

Dabei ist userId eine leere Zeichenfolge. Also keine Möglichkeit sich zu authentifizieren. Wie bekomme ich Zugang zu Benutzername und Passwort? Adviice würde viele


UPDATE ich jetzt sehr zuversichtlich bin klar sein, das Problem für einen seond Authentifizierungsanbieter meine Notwendigkeit zurückzuführen ist. (d. h. ein lokaler als auch ein sozialer). Aber nicht sicher, wie diese


security_applicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
 
\t xmlns:security="http://www.springframework.org/schema/security" 
 
\t xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 
\t xsi:schemaLocation="http://www.springframework.org/schema/beans 
 
\t \t \t \t \t http://www.springframework.org/schema/beans/spring-beans.xsd 
 
\t \t \t \t \t http://www.springframework.org/schema/security 
 
\t \t \t \t \t http://www.springframework.org/schema/security/spring-security.xsd"> 
 

 
\t <security:http use-expressions="true" entry-point-ref="appAuthenticationEntryPoint"> 
 

 
\t \t <security:intercept-url pattern="/login" access="permitAll()" /> 
 
\t \t <security:intercept-url pattern="/flow-entry.html" access="hasRole('ROLE_USER')"/> 
 
\t \t <security:intercept-url pattern="/flow-jobpostdata.html" access="permitAll()"/> 
 
\t \t <security:intercept-url pattern="/flow-jobpostdata_anydegree.html" access="permitAll()"/> 
 
\t \t <security:intercept-url pattern="/j_spring_security_check" access="permitAll()"/> 
 
\t \t 
 
\t 
 
\t <!-- Adds social authentication filter to the Spring Security filter chain. --> 
 
\t \t <security:custom-filter before="PRE_AUTH_FILTER" ref="socialAuthenticationFilter"/> 
 
\t \t <security:custom-filter position="FORM_LOGIN_FILTER" ref="SecurityAuthFilter"/> 
 
\t 
 
\t 
 
\t </security:http> 
 

 
<!-- authentication manager and its provider(social provider deals with social login & local user provider deals with form login) --> 
 
\t <security:authentication-manager alias="authenticationManager"> 
 
\t \t <security:authentication-provider ref="socialAuthenticationProvider"/> 
 
\t \t <security:authentication-provider user-service-ref="localUserDetailService"/> 
 
\t </security:authentication-manager> 
 

 
\t <bean id="socialAuthenticationProvider" class="org.springframework.social.security.SocialAuthenticationProvider"> 
 
\t \t <constructor-arg ref="inMemoryUsersConnectionRepository"/> 
 
\t \t <constructor-arg ref="socialUserDetailService"/> 
 
\t </bean> 
 
\t 
 
\t <bean id="appAuthenticationEntryPoint" 
 
\t \t class=" jake.delivery.controller.welcome.AppAuthenticationEntryPoint"> 
 
\t \t <constructor-arg name="loginFormUrl" value="/login"/> 
 
    
 
\t <bean id="failureHandler" 
 
\t \t class="org.springframework.security.web.authentication.SimpleUrlAuthenticationFailureHandler"> 
 
\t \t <constructor-arg name="defaultFailureUrl" value="/services/accessdenied"/> 
 
\t </bean> 
 
\t \t 
 
\t <bean class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter" 
 
\t \t id="SecurityAuthFilter"> 
 
\t \t <property name="authenticationManager" ref="authenticationManager"/> 
 
\t \t <property name="authenticationSuccessHandler" ref="successHandler"/> 
 
\t \t <property name="authenticationFailureHandler" ref="failureHandler"/> 
 
\t \t <property name="filterProcessesUrl" value="/j_spring_security_check"/> 
 
\t \t <property name="rememberMeServices" ref="rememberMeServices"/ \t </bean> 
 

 
\t <!-- social login filter which is a pre authentication filter and works for /auth service url --> 
 
\t <bean id="socialAuthenticationFilter" class="org.springframework.social.security.SocialAuthenticationFilter"> 
 
\t \t <constructor-arg name="authManager" ref="authenticationManager"/> 
 
\t \t <constructor-arg name="userIdSource" ref="userIdSource"/> 
 
\t \t <constructor-arg name="usersConnectionRepository" ref="inMemoryUsersConnectionRepository"/> 
 
\t \t <constructor-arg name="authServiceLocator" ref="appSocialAuthenticationServiceRegistry"/> 
 
\t \t <property name="authenticationSuccessHandler" ref="successHandler"/> 
 
\t </bean> 
 

 
\t <!-- inmemory connection repository which holds connection repository per local user --> 
 
\t <bean id="inMemoryUsersConnectionRepository" 
 
\t \t class="org.springframework.social.connect.mem.InMemoryUsersConnectionRepository"> 
 
\t \t <constructor-arg name="connectionFactoryLocator" ref="appSocialAuthenticationServiceRegistry"/> 
 
\t \t <property name="connectionSignUp" ref="connectionSignUp"/> 
 
\t </bean> 
 

 
\t <!-- service registry will holds connection factory of each social provider--> 
 
\t <bean id="appSocialAuthenticationServiceRegistry" 
 
\t \t class="jake.delivery.controller.welcome.AppSocialAuthenticationServiceRegistry"> 
 
\t \t <constructor-arg> 
 
\t \t \t <list> 
 
\t \t \t \t <ref bean="facebookAuthenticationService"/> 
 
\t \t \t </list> 
 
\t \t </constructor-arg> 
 
\t </bean> 
 

 
\t <bean id="facebookAuthenticationService" 
 
\t \t class="org.springframework.social.facebook.security.FacebookAuthenticationService"> 
 
\t \t <constructor-arg name="apiKey" value="xxxxxxx"/> 
 
\t \t <constructor-arg name="appSecret" value="xxxxxx"/> 
 
\t </bean> 
 

 
\t <bean id="userIdSource" class="org.springframework.social.security.AuthenticationNameUserIdSource"/> 
 

 
\t <bean id="connectionSignUp" class="jake.delivery.controller.welcome.AppConnectionSignUp"/> 
 

 

 

 

 

 
</beans>

UserDetailService Implementierung

package jake.prototype2.service.loginservices; 

import org.springframework.security.core.userdetails.UserDetailsService; 
import org.springframework.security.core.userdetails.UsernameNotFoundException; 
import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import jake.prototype2.model.structure.SSm; 

public class LocalUserDetailService implements UserDetailsService { 



public LocalUserDetailService() 
{ 
    SSm.getLogger().debug("init"); 
} 

@Override 
@Transactional 
public SpringSecurityLocalUser loadUserByUsername(final String userId) throws UsernameNotFoundException 
{ 

       SSm.getLogger().debug(this.getClass().getName()+"\n\n\n\n\n I don't do anything yet\n\n\n\n\n\n",new Exception()); 
       SSm.getLogger().debug("userId" + userId); 
            throw new UsernameNotFoundException(" fork me sideways "); 

} 
0 konfigurieren

}

Stacktrace. Obwohl es keine Ausnahme gab, habe ich den Stacktrace zu Referenzzwecken erfasst.

java.lang.Exception bei jake.prototype2.service.loginservices.LocalUserDetailService.loadUserByUsername (LocalUserDetailService.java:32) bei jake.prototype2.service.loginservices.LocalUserDetailService.loadUserByUsername (LocalUserDetailService.java:16) bei sun.reflect.NativeMethodAccessorImpl.invoke0 (native Methode) bei sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:62) bei sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:43) auf Java. lang.reflect.Method.invoke (Method.java:497) unter org.springframework.aop.support.AopUtils.invokeJoinp ointUsingReflection (AopUtils.java:302) bei org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint (ReflectiveMethodInvocation.java:190) bei org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:157) bei org.springframework.transaction.interceptor.TransactionInterceptor $ 1.proceedWithInvocation (TransactionInterceptor.java:99) bei org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction (TransactionAspectSupport.java:281) bei org.springframework.transaction.interceptor.TransactionInterceptor .invoke (TransactionInterceptor.java:96) bei org.springframework.aop.framework.ReflectiveMethodInvocation.proceed (ReflectiveMethodInvocation.java:179) at org.springframework.aop.fr amework.JdkDynamicAopProxy.invoke (JdkDynamicAopProxy.java:208) unter com.sun.proxy. $ Proxy50.loadUserByUsername (Unbekannte Quelle) unter org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser (DaoAuthenticationProvider.java:114) bei org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate (AbstractUserDetailsAuthenticationProvider.java:144) bei org.springframework.security.authentication.ProviderManager.authenticate (ProviderManager.java: 174) bei org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication (UsernamePasswordAuthenticationFilter.java:94) bei org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter (AbstractAuthenticationProcessingFilter.java:212) bei org. springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:331) bei org.springframework.security.web.authentication.Abst ractAuthenticationProcessingFilter.doFilter (AbstractAuthenticationProcessingFilter.java:200) bei org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:331) bei org.springframework.security.web.csrf.CsrfFilter.doFilterInternal (CsrfFilter. java: 124) bei org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) bei org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:331) bei org. springframework.security.web.header.HeaderWriterFilter.doFilterInternal (HeaderWriterFilter.java:66) bei org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) bei org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.d Ofilter (FilterChainProxy.java:331) bei org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal (WebAsyncManagerIntegrationFilter.java:56) bei org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter. java: 107) bei org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:331) bei org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter (SecurityContextPersistenceFilter.java:105) bei org.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter (FilterChainProxy.java:331) unter org.springframework.security.web.FilterChainProxy.doFilterInternal (FilterChainProxy.java:214) unter org.springframework.security.web. Filterkette Proxy.doFilter (FilterChainProxy.java:177) bei org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate (DelegatingFilterProxy.java:346) bei org.springframework.web.filter.DelegatingFilterProxy.doFilter (DelegatingFilterProxy.java:262) bei org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:239) bei org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:206) bei org.springframework.web.filter. CharacterEncodingFilter.doFilterInternal (CharacterEncodingFilter.java:121) bei org.springframework.web.filter.OncePerRequestFilter.doFilter (OncePerRequestFilter.java:107) bei org.apache.catalina.core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:239) bei org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:206) bei org.apache.catalina.core.StandardWrapperValve.invoke (StandardWrapperValve.java:219) bei org.apache.catalina.core. StandardContextValve.invoke (StandardContextValve.java:106) bei org.apache.catalina.authenticator.AuthenticatorBase.invoke (AuthenticatorBase.java:502) bei org.apache.catalina.core.StandardHostValve.invoke (StandardHostValve.java:142) bei org.apache.catalina.valves.ErrorReportValve.invoke (ErrorReportValve.java:79) bei org.apache.catalina.valves.AbstractAccessLogValve.invoke (AbstractAccessLogValve.java:616) bei org.apache.catalina.core. StandardEngineValve.invoke (StandardEngineValve.java:88) bei org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:518) bei org.apache.coyote.http11.AbstractHttp11Processor.process (AbstractHttp11Processor.java:1091) bei org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process (AbstractProtocol.java:673) bei org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun (NioEndpoint.java:1526) bei org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.Run (NioEndpoint.java:1482) bei java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1142) bei java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:617) bei org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run (TaskThread.java:61) bei java.lang.Thread.run (Thread.java:745)

+1

spring speichert den Benutzernamen und das Passwort, die als Parameter j_username und j_password in seinem Kontext empfangen wurden. Rufen Sie dann Ihre Methode auf, um Benutzer nur nach Benutzername zu laden und dann die zurückgegebene Entität zu überprüfen (instanceof UserDetails). –

+0

Danke! Aber wie bekomme ich Zugriff auf die Werte des Un pw-Parameters vor meiner Instanz von UserDetails oder in meiner Instanz von UserDetails? – Jake

+1

Sie können empfangene Anmeldeinformationen in der Authentifizierungsmethode in der ProviderManager-Klasse überprüfen. –

Antwort

1

Das Problem bestand eigentlich darin, mehrere Authentifizierungsanbieter zu erfordern.

Es stellt sich heraus, dass nur eine Zeile der Konfiguration fehlte:

<!-- authentication manager and its provider(social provider deals with social login & local user provider deals with form login) --> 
<security:authentication-manager alias="authenticationManager"> 
    <security:authentication-provider ref="socialAuthenticationProvider"/> 
    <security:authentication-provider ref="customAuthenticationProvider" /> 
    <security:authentication-provider user-service-ref="localUserDetailService"/> 
</security:authentication-manager> 

<bean id="customAuthenticationProvider" class="jake.delivery.controller.welcome.CustomAuthenticationProvider"> 
    <property name="auService" ref="auService" /> 
</bean> 

ich eine zusätzliche Zeile zu authentication-manager für customAuthenticationProvider hinzuzufügen benötigt.

Verwandte Themen