2015-12-19 13 views
5

Podążam za this tutorial, aby użyć Spring Security. Chciałbym użyć Hibernate do zapytań do bazy danych. Skonfigurowałem kod, ale zgłoszony wyjątek zostanie zgłoszony.Wyjątek wiosennego rzutu w przypadku niezdefiniowanej fasoli

Zdefiniowałem ziarno w spring-security.xml i my-servlet.xml, ale wciąż nie uzyskałem wyniku.

Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No bean named 'myMemberDetailsService' is defined 
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBeanDefinition(DefaultListableBeanFactory.java:570) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getMergedLocalBeanDefinition(AbstractBeanFactory.java:1114) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:279) 
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194) 
    at org.springframework.beans.factory.support.BeanDefinitionValueResolver.resolveReference(BeanDefinitionValueResolver.java:320) 
    ... 93 more 

MemberRepository

public class MemberRepositoryImpl implements MemberRepository { 

    SessionFactory sessionFactory; 

    @SuppressWarnings("unchecked") 
    @Override 
    public Member findByUserName(String username) { 

     List<Member> members = new ArrayList<Member>(); 
     members = sessionFactory.getCurrentSession() 
       .createQuery("from Member where username=?") 
       .setParameter(0, username).list(); 

     if (members.size() > 0) { 
      return members.get(0); 
     } else { 
      return null; 
     } 
    } 

} 

MyMemberDetailsService

public class MyMemberDetailsService implements UserDetailsService { 

    private MemberRepository memberRep; 

    @Override 
    public UserDetails loadUserByUsername(final String username) 
      throws UsernameNotFoundException { 

     Member member = memberRep.findByUserName(username); 
     HashSet<String> roles = new HashSet<String>(); 
     roles.add("ROLE_MEMBER"); 
     List<GrantedAuthority> authorities = buildUserAuthority(roles); 

     return buildUserForAuthentication(member, authorities); 

    } 

    // Converts com.mkyong.users.model.User user to 
    // org.springframework.security.core.userdetails.User 
    private User buildUserForAuthentication(Member member, 
      List<GrantedAuthority> authorities) { 
     return new User(member.getUsername(), member.getPassword(), 
       member.isEnabled(), true, true, true, authorities); 
    } 

    private List<GrantedAuthority> buildUserAuthority(Set<String> userRoles) { 

     Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>(); 

     // Build user's authorities 
     for (String userRole : userRoles) { 
      setAuths.add(new SimpleGrantedAuthority(userRole)); 
     } 

     List<GrantedAuthority> Result = new ArrayList<GrantedAuthority>(
       setAuths); 

     return Result; 
    } 

} 

my-servlet.xml

<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop" 
    xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 
    xmlns:mvc="http://www.springframework.org/schema/mvc" 
    xsi:schemaLocation="http:/www.springframework.org/schema/beans 
    http:/www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http:/www.springframework.org/schema/aop 
    http:/www.springframework.org/schema/aop/spring-aop-3.0.xsd 
    http:/www.springframework.org/schema/tx 
    http:/www.springframework.org/schema/tx/spring-tx-3.0.xsd 
    http:/www.springframework.org/schema/context 
    http:/www.springframework.org/schema/mvc"> 


    <context:annotation-config /> 
    <mvc:annotation-driven /> 
    <mvc:view-controller path="/index" /> 
    <mvc:view-controller path="/" view-name="index" /> 
    <mvc:view-controller path="/signin" /> 



    <mvc:resources mapping="resources/**" location="resources/" /> 
    <context:component-scan base-package="com.myProject" /> 
    <bean id="restTemplate" class="org.springframework.web.client.RestTemplate" /> 

    <bean id="viewResolver" 
     class="org.springframework.web.servlet.view.tiles3.TilesViewResolver" /> 
    <bean id="tilesConfigurer" 
     class="org.springframework.web.servlet.view.tiles3.TilesConfigurer"> 
     <property name="definitions"> 
      <list> 
       <value>/WEB-INF/tiles.xml</value> 
      </list> 
     </property> 
    </bean> 


    <bean id="memberRep" class="com.myProject.repository.MemberRepositoryImpl"> 
     <property name="sessionFactory" ref="sessionFactory" /> 
    </bean> 


    <bean id="myMemberDetailsService" class="com.myProject.service.MyMemberDetailsService"> 
     <property name="memberRep" ref="memberRep" /> 
    </bean> 

    <!-- Hibernate Config --> 

    <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource" 
     destroy-method="close"> 
     <property name="driverClassName" value="com.mysql.jdbc.Driver" /> 
     <property name="url" value="jdbc:mysql://localhost:8889/myProject" /> 
     <property name="username" value="jack" /> 
     <property name="password" value="jack" /> 
    </bean> 

    <bean id="sessionFactory" 
     class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 
     depends-on="dataSource"> 
     <property name="dataSource" ref="dataSource" /> 
     <property name="packagesToScan" value="com.myProject.model" /> 
     <property name="hibernateProperties"> 
      <props> 
       <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> 
       <prop key="hibernate.format_sql">true</prop> 
       <prop key="hibernate.use_sql_comments">true</prop> 
       <prop key="hibernate.show_sql">true</prop> 
       <prop key="hibernate.hbm2ddl.auto">update</prop> 
      </props> 
     </property> 
    </bean> 

    <bean id="transactionManager" 
     class="org.springframework.orm.hibernate4.HibernateTransactionManager"> 
     <property name="sessionFactory" ref="sessionFactory"></property> 
    </bean> 

    <tx:advice id="txAdvice" transaction-manager="transactionManager"> 
     <tx:attributes> 
      <tx:method name="get*" read-only="true" /> 
      <tx:method name="find*" read-only="true" /> 
      <tx:method name="*" /> 
     </tx:attributes> 
    </tx:advice> 

    <aop:config> 
     <aop:pointcut id="userServicePointCut" 
      expression="execution(* com.myProject.service.*Service.*(..))" /> 
     <aop:advisor advice-ref="txAdvice" pointcut-ref="userServicePointCut" /> 
    </aop:config> 

    <!-- End Hibernate Config --> 
</beans> 

wiosna-security.xml

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



    <beans:import resource='login-service.xml' /> 
    <http auto-config="true" use-expressions="true"> 
     <intercept-url pattern="/" access="permitAll" /> 
     <intercept-url pattern="/member**" access="hasRole('ROLE_MEMBER')" /> 
     <intercept-url pattern="/signin" access="permitAll" /> 


     <access-denied-handler error-page="/403" /> 
     <form-login login-page="/signin" default-target-url="/index" 
      authentication-failure-url="/signin?error" username-parameter="username" 
      password-parameter="password" /> 
     <logout logout-success-url="/login?logout" /> 
     <!-- enable csrf protection --> 
     <csrf /> 
    </http> 
    <authentication-manager> 
     <authentication-provider user-service-ref="myMemberDetailsService"> 
      <password-encoder hash="bcrypt" /> 


     </authentication-provider> 
    </authentication-manager> 
</beans:beans> 
+1

Wygląda plik my-servlet.xml nie jest jeszcze załadowany (powinny być zdefiniowane w web.xml) – kryger

+0

@kryger zdefiniowałem servlet-mapping –

+0

musisz zdefiniować 'myMemberDetailsService' jako komponent bean. masz plik spring-database.xml z przykładu w twoim projekcie? –

Odpowiedz

4

Właśnie przeczytałem tutorial i widziałem, nie mówiąc już nic o web.xml konfiguracji, więc ściągnąłem go zobaczyć jak to zostało skonfigurowane.

Powiedziałeś, że próbujesz zdefiniować myMemberDetailsService w obu miejscach, my-servlet i spring-security, ale to nie zadziałało.

Więc myślę, że jest to problem z konfiguracją więc spróbuj zmienić web.xml następująco (użyłem nazwy zostały użyte w swoim pytaniu, ale proszę to sprawdzić, aby zobaczyć, czy coś jest nie tak):

<servlet> 
    <servlet-name>my-servlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value> 
      /WEB-INF/my-servlet.xml, 
      /WEB-INF/spring-security.xml 
     </param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

i usunąć swój globalny <context-param> na ten contextConfigLocation param jeśli obecne.

Jeśli to nie zadziała, zalecam użycie podobnej konfiguracji jak samouczek, tzn. Pozostaw minimalną konfigurację MVC w my-servlet.xml i skonfiguruj pozostałe komponenty w oddzielnym kontekście.

Mam nadzieję, że pomoże!

0

W tym UserDetailsService w securityxml rozwiąże to problem.

W swoim spring-security.xml uwzględnij definicję implementacji MyMemberDetailsService.

<beans:bean class="your.package.MyMemberDetailsService" 
    id="myMemberDetailsService" /> 

widzę, że jesteś w tym login-service.xml w swoim spring-security.xml. Zatem określenie komponentu bean usługi użytkownika w login-service.xml również rozwiąże problem.

0

Zgodnie z samouczkiem plik web.xml powinien zawierać odniesienie do pliku konfiguracyjnego xml.

sieć.xml będzie wyglądać tak, jak:

<servlet> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
     <load-on-startup>1</load-on-startup> 
    </servlet> 
    <servlet-mapping> 
     <servlet-name>mvc-dispatcher</servlet-name> 
     <url-pattern>*</url-pattern> 
    </servlet-mapping> 

Plik mcc-dispatcher-servlet xml powinien zawierać import wszystkich innych xml.

MVC-dyspozytor-serwlet xml będzie wyglądać

<?xml version="1.0" encoding="UTF-8"?> 

    <beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
     ..."> 

     <import resource="my-servlet.xml" /> 
     <import resource="spring-security.xml" /> 
     ... 
    </beans> 
Powiązane problemy