2016-09-28 12 views
0

セキュリティxml設定に問題があります。私は非常に短いで複数の認証プロバイダ:/ j_spring_security_checkとソーシャルログイン

(ソーシャル・ログインが正常に動作します)ローカルログインのための私のログインフォームからユーザー名とパスワードにアクセスすることはできませんよ: ユーザーがログインフォームを送信すると、私のコードへの最初の出現はですUserDetailService

public SpringSecurityLocalUser loadUserByUsername(final String userId) throws UsernameNotFoundException 

ここで、userIdは空のStringです。したがって、認証する方法はありません。ユーザー名とパスワードにアクセスするにはどうすればよいですか? Adviiceがはるかに


UPDATE をいただければ幸い私は今、問題はseond認証プロバイダのための私の必要性に起因してかなり確信しています。 (すなわち、1つのローカルおよび1つのソーシャル)。しかし、この


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

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を設定する方法がわかりません

}

Stacktrace。 例外はありませんが、参考のためにスタックトレースを取得しました。

jake.prototype2.service.loginservices.LocalUserDetailService.loadUserByUsernameでjake.prototype2.service.loginservices.LocalUserDetailService.loadUserByUsername(LocalUserDetailService.java:32) でれるjava.lang.Exception(LocalUserDetailService.java:16 )sun.reflect.DelegatingMethodAccessorImpl.invokeでsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) でsun.reflect.NativeMethodAccessorImpl.invoke0(ネイティブメソッド) (DelegatingMethodAccessorImpl.java:43)は、Javaで で。 lang.reflect.Method.invoke(Method.java:497) at org.springframework.aop.support.AopUtils.invokeJoinp org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) でorg.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190) でointUsingReflection(AopUtils.java:302) で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) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) at org.springframework.aop.fr amework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:208)com.sun.proxyで 。$ Proxy50.loadUserByUsername(不明なソース)org.springframework.security.authentication.daoで 。DaoAuthenticationProvider.retrieveUser org.springframework.security.authentication.ProviderManager.authenticate(ProviderManager.javaでorg.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:144)で(DaoAuthenticationProvider.java:114) : 174)ORGでorg.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:212) でorg.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:94) で。 springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331) at org.springframework.security.web.authentication.Abst ractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:200)org.springframework.security.web.csrf.CsrfFilter.doFilterInternalでorg.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331) で (CsrfFilter。 Javaの:ORGでorg.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331) でorg.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) で124) 。 org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) でspringframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:66) でorg.springframework.security.web.FilterChainProxy $ VirtualFilterChain.d oFilter(FilterChainProxy.java:331)org.springframework.web.filter.OncePerRequestFilter.doFilterでorg.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:56) で (OncePerRequestFilter。 Javaの:107) org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilterでorg.springframework.security.web.FilterChainProxy $ VirtualFilterChain.doFilter(FilterChainProxy.java:331) (SecurityContextPersistenceFilter.java:105) での(フィルタチェーンのプロパティ) FilterChain org.springframework.web.filter.DelegatingFilterProxy.doFilterでorg.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:346) でProxy.doFilter(FilterChainProxy.java:177) (DelegatingFilterProxy.java:262) org.springframework.web.filterでorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) でorg.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) で。 org.apache.catalina.core.ApplicationFilterChain.internalDoFilterでorg.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) でCharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:121) (ApplicationFilterChain.java:239) でorg.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) at org.apache.catalina.core。 StandardContextValve.invoke(StandardContextValue.java:106) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616) at org.apache.catalina.core。 StandardEngineValve.invoke(StandardEngineValve.java:88) at org.apache.catalina.connector。CoyoteAdapter.service(CoyoteAdapter.java:518) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091) at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:673) at org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.doRun(NioEndpoint.java:1526) at org.apache.tomcat.util.net.NioEndpoint $ SocketProcessor.run(NioEndpoint.java:1482) at 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) at java.lang.Thread.run(Thread.java:745)

+1

springは、コンテキスト内でパラメータj_usernameおよびj_passwordとして受け取ったユーザー名とパスワードを受け取り、ユーザー名だけでユーザーをロードし、返されたエンティティ(instanceof UserDetails)をチェックするようにメソッドを呼び出します。 –

+0

ありがとう!しかし、UserDetailsのインスタンスの前、またはUserDetailsのインスタンスの中で、unwパラメータの値にどのようにアクセスできますか? – Jake

+1

'ProviderManager'クラスの' authenticate'メソッドで受信した認証情報を確認できます。 –

答えて

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> 

私はcustomAuthenticationProviderためauthentication-managerに行を追加する必要がありました。

関連する問題