多个身份验证提供程序:/ j_spring_security_check和社交登录

时间:2016-09-28 12:40:26

标签: java spring spring-security

我的安全xml配置存在问题。我无法从登录表单访问用户名和密码进行本地登录(社交登录正常)

非常简短: 当用户提交登录表单时,第一次出现在我的代码中的是UserDetailService

public SpringSecurityLocalUser loadUserByUsername(final String userId) throws UsernameNotFoundException 

其中userId是一个空字符串。因此无法进行身份验证。如何访问用户名和密码? Adviice将不胜感激

更新 我现在非常有信心这个问题是由于我需要一个seond身份验证提供程序。 (即一个本地人以及一个社交人)。但不知道如何配置这个

security_applicationContext.xml



<beans xmlns="http://www.springframework.org/schema/beans"
	 xmlns:security="http://www.springframework.org/schema/security"
	 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.xsd
					http://www.springframework.org/schema/security
					http://www.springframework.org/schema/security/spring-security.xsd">

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

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

<!-- 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 user-service-ref="localUserDetailService"/>
	</security:authentication-manager>

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

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

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

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

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

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

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





</beans>
&#13;
&#13;
&#13;

UserDetailService实施

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  ");

}

}

堆栈跟踪。 虽然没有例外,但我抓住了堆栈跟踪以供参考。

  

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

1 个答案:

答案 0 :(得分:1)

问题实际上与要求多个身份验证提供程序有关。

事实证明只缺少一行配置:

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

我需要为authentication-manager添加额外的一行customAuthenticationProvider

相关问题