2015-10-20 21 views
0
@Configuration 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

private final Log log = LogFactory.getLog(WebSecurityConfig.class); 

@Value("${spring.profiles.active}") 
private String env; 

@Value("${rememberMe.privateKey}") 
private String rememberMeKey; 

@Resource 
private UserDetailsService userService; 

@Bean 
public RememberMeServices rememberMeServices() { 

    TokenBasedRememberMeServices rememberMeServices = new TokenBasedRememberMeServices(rememberMeKey, userService); 

    // See http://stackoverflow.com/questions/25565809/implementing-a-remember-me-for-spring-social 
    rememberMeServices.setAlwaysRemember(true); 

    return rememberMeServices; 

} 

@Bean 
public PasswordEncoder passwordEncoder() { 
    log.info("Creating password encoder bean"); 
    return new BCryptPasswordEncoder(); 
} 


@Override 
protected void configure(HttpSecurity http) throws Exception { 

    http 
     .authorizeRequests() 
      .antMatchers("/", 
        "/signup", 
        "/public/**", 
        "https://stackoverflow.com/users/*", 
        "/auth/**").permitAll() 
      .anyRequest().authenticated(); 

    http 
     .formLogin() 
      .loginPage("/signin") 
      .permitAll().and() 
     .rememberMe().key(rememberMeKey).rememberMeServices(rememberMeServices()).and() 
     .logout() 
      .deleteCookies("JSESSIONID") 
      .permitAll() 
     .and().apply(new SpringSocialConfigurer()); 

    if (!env.equals("dev")) 
     http.requiresChannel().anyRequest().requiresSecure(); 

} 

@Autowired 
@Override 
protected void configure(AuthenticationManagerBuilder authManagerBuilder) throws Exception { 
    authManagerBuilder.userDetailsService(userService).passwordEncoder(passwordEncoder()); 
} 

} 

配置的UserDetailsS​​ervice到WebSecurityConfigurerAdapter作爲一個UserDetailsS​​ervice我有以下幾點:不能使用Spring社會

@Service 
@Transactional(propagation=Propagation.SUPPORTS, readOnly=true) 
public class UserServiceImpl implements UserService, UserDetailsService, SocialUserDetailsService { 

private final Logger log = Logger.getLogger(this.getClass()); 

private UserRepository userRepository; 
private PasswordEncoder passwordEncoder; 

@Autowired 
public UserServiceImpl(UserRepository userRepository, 
     PasswordEncoder passwordEncoder) { 

    this.userRepository = userRepository; 
    this.passwordEncoder = passwordEncoder; 

} 

@Override 
public SocialUserDetails loadUserByUsername(String username) 
     throws UsernameNotFoundException { 
    User user = userRepository.findByEmail(username); 
    if (user == null) 
     throw new UsernameNotFoundException(username); 

    return new UserDetailsImpl(user); 
} 

@Override 
public User findOne(long userId) { 

    User user = userRepository.findOne(userId); 
    return user; 

} 

@Override 
@Transactional(propagation=Propagation.REQUIRED, readOnly=false) 
public User signup(SignupForm signupForm) { 
    final User user = new User(); 
    user.setEmail(signupForm.getEmail()); 
    user.setName(signupForm.getName()); 
    user.setPassword(passwordEncoder.encode(signupForm.getPassword())); 
    userRepository.save(user); 
    MyUtil.logInUser(user); 
    return user;   
} 

@Override 
@Transactional(propagation=Propagation.REQUIRED, readOnly=false) 
public void update(long userId, UserEditForm userEditForm) { 

    User user = userRepository.findOne(userId); 
    user.setName(userEditForm.getName()); 
    userRepository.save(user); 

} 

@Override 
public SocialUserDetails loadUserByUserId(String userId) 
     throws UsernameNotFoundException, DataAccessException { 
    return loadUserByUsername(userId); 
} 

} 

,我發現了以下錯誤:

org.springframework.beans.factory.BeanCreationException :創建名爲'webSecurityConfig'的bean時出錯:注入資源依賴關係失敗;嵌套異常是org.springframework.beans.factory.UnsatisfiedDependencyException:在文件[/ home/hardddisk/applications/tomcat8/webapps/ROOT/WEB-INF/classes/com/kefet/controller /中定義名稱'userServiceImpl' UserServiceImpl.class]:通過類型爲[com.kefet.controller.UserRepository]:的索引爲0的構造方法參數表示的不滿足的依賴關係:未找到依賴關係的[com.kefet.controller.UserRepository]類型的限定bean:期望至少有一個bean這符合這種依賴關係的自動導向候選資格。依賴註釋:{};嵌套異常是org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到符合要求的[com.kefet.controller.UserRepository]類型的限定bean:期望至少1個符合此依賴關係自動裝配候選資格的Bean。依賴註解:{} 在org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.postProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:311) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.populateBean(AbstractAutowireCapableBeanFactory.java:1214) 在有機.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:543) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482) 在org.springframework.beans.factory .support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:305) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRe (org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301)) at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) 在org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:772) 在org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:835) 在org.springframework.context。 support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:537) at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:446) at org.springframework.web.context.ContextLoader.i nitWebApplicationContext(ContextLoader.java:328) 在org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:107) 在org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4727) 在org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5167) at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) at org.apache.catalina.core.ContainerBase。 addChildInternal(ContainerBase.java:725) at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:701) at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:717) at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:945) at org.apache.catalina.startup.HostConfig $ DeployWar.run(HostConfig.java:1768) at java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask .run(FutureTask.java:266) at java.util。併發.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617) at java.lang.Thread.run(Thread.java:745) Caused通過:org.springframework.beans.factory.UnsatisfiedDependencyException:在文件[/ home/hardddisk/applications/tomcat8/webapps/ROOT/WEB-INF/classes/com/kefet/controller/UserServiceImpl中定義名稱'userServiceImpl' .class]:通過類型爲[com.kefet.controller.UserRepository]:的索引0的構造方法參數表示的不滿足的依賴關係:未找到依賴關係的[com.kefet.controller.UserRepository]類型的限定bean:期望至少有一個bean符合此依賴關係的自動導向候選人的資格。依賴註釋:{};嵌套異常是org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到符合要求的[com.kefet.controller.UserRepository]類型的限定bean:期望至少1個符合此依賴關係自動裝配候選資格的Bean。依賴註解:{} 在org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:749) 在org.springframework.beans.factory.support.ConstructorResolver.autowireConstructor(ConstructorResolver.java:185) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.autowireConstructor(AbstractAutowireCapableBeanFactory.java:1143) 在org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1046) 在org.springframework.beans .factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:510) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBe anFactory.java:482) at org.springframework.beans.factory.support.AbstractBeanFactory $ 1.getObject(AbstractBeanFactory.java:305) at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230 ) 在org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:301) 在org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:196) 在org.springframework .beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1192) at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1116) at org.springframework.beans.factory.support 。 DefaultListableBeanFactory.resolveDependency(DefaultListableBeanFactory.java:1014) 在org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.autowireResource(CommonAnnotationBeanPostProcessor.java:508) 在org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.getResource(CommonAnnotationBeanPostProcessor.java:486) 在org.springframework.context.annotation.CommonAnnotationBeanPostProcessor $ ResourceElement.getResourceToInject(CommonAnnotationBeanPostProcessor.java:615) 在org.springframework.beans.factory.annotation.InjectionMetadata $ InjectedElement.inject(InjectionMetadata.java:169) 的組織。 springframework.beans.factory.annotation.InjectionMetadata.inject(InjectionMetadata.java:88) at org.springframework.context.annotation.CommonAnnotationBeanPostProcessor.p ostProcessPropertyValues(CommonAnnotationBeanPostProcessor.java:308) ... 26更多 引起:org.springframework.beans.factory.NoSuchBeanDefinitionException:找不到符合條件的[com.kefet.controller.UserRepository]類型的限定bean:期望至少爲1有資格作爲這個依賴關係的autowire候選者的bean。依賴註解:{} 在org.springframework.beans.factory.support.DefaultListableBeanFactory.raiseNoSuchBeanDefinitionException(DefaultListableBeanFactory.java:1373) 在org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1119) 在org.springframework.beans.factory.support.DefaultListableBeanFactory。resolveDependency(DefaultListableBeanFactory.java:1014) at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:813) at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java: 741) ... 44更多

謝謝。

回答

0

錯誤消息聲稱它找不到UserRepository類自動裝入您的構造函數。您必須使用@Component(或其某些子註釋,如@Repository/@Service)註釋該類,以使其可用於自動裝配。

//更新:

首先的 - 如果你是從頭開始這個項目,我建議尋找到春季啓動 - 這將簡化很多的配置爲您服務。

你沒有提到你試圖在這裏使用彈簧數據jpa。 你必須讓Spring知道你的接口在哪裏。這由@EnableJpaRepositories完成。添加

@EnableJpaRepositories(basePackages = "com.kefet.controller") 

高於您的DatabaseConfig。然後它會抱怨它需要entityManagerFactory。添加:

@Bean 
public LocalContainerEntityManagerFactoryBean entityManagerFactory() throws SQLException { 
    LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean(); 

    DataSource dataSource = dataSource(); 
    entityManagerFactoryBean.setDataSource(dataSource); 
    entityManagerFactoryBean.setJpaVendorAdapter(new HibernateJpaVendorAdapter()); 

    entityManagerFactoryBean.setJpaProperties(jpaProperties()); 
    entityManagerFactoryBean.setPackagesToScan("com.kefet.controller"); 

    return entityManagerFactoryBean; 
} 

@Bean 
public HibernateExceptionTranslator hibernateExceptionTranslator() { 
    return new HibernateExceptionTranslator(); 
} 

protected Properties jpaProperties() { 
    Properties jpaProperties = new Properties(); 
    jpaProperties.put(org.hibernate.cfg.Environment.DIALECT, "org.hibernate.dialect.MySQL5Dialect"); 
    jpaProperties.put(org.hibernate.cfg.Environment.SHOW_SQL, false); 
    return jpaProperties; 
} 

到相同的DatabaseConfig類。

這將解決這篇文章的初始問題。你會得到更多的錯誤(沒有[org.springframework.social.facebook.api.Facebook]類型的合格bean),但你需要逐一修復它們。

+0

我試過所有的組合但是沒有工作 – kefet

+0

然後分享我們UserRepository的代碼,它的包和配置類的包 – freakman

+0

package com.kefet.controller; import org.springframework.data.jpa.repository.JpaRepository; 公共接口UserRepository延伸JpaRepository { \t \t 用戶findByEmail(字符串電子郵件); } – kefet