2015-12-19 14 views
5

Sto seguendo this tutorial per utilizzare Spring Security. Vorrei usare Hibernate per le query del database. Ho configurato il codice ma viene generata un'eccezione.Spring genera un'eccezione per bean non definito

Ho definito il bean in spring-security.xml e my-servlet.xml ma ancora nessun risultato.

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> 

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

Sembra che il file my-servlet.xml non è nemmeno caricato (dovrebbe essere definito in web.xml) – kryger

+0

@kryger I definito servlet-mapping –

+0

è necessario definire 'myMemberDetailsService' come bean. hai il file spring.xml dall'esempio nel tuo progetto? –

risposta

4

Ho appena letto il tutorial e ho visto che non ha menzionato nulla di configurazione web.xml, così ho scaricato per vedere come è stato configurato.

Hai detto, hai provato a definire myMemberDetailsService in entrambi i posti, my-servlet e spring-security ma non ha funzionato.

Beh, io credo che sia un problema di configurazione in modo prega di provare a cambiare la vostra web.xml come segue (ho usato i nomi che avete usato nella tua domanda, ma vi prego di controllare fuori per vedere se c'è qualcosa che non va):

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

e rimuovere il vostro globale <context-param> per la contextConfigLocation param se presente.

Se questo non funziona io vi consiglio di utilizzare una configurazione simile a quella del tutorial, vale a dire, lasciare configurazione minima MVC in my-servlet.xml e configurare il resto dei fagioli in un contesto separato.

Spero che aiuti!

0

Compreso UserDetailsService in securityxml risolverà il problema.

Nel proprio spring-security.xml includere la definizione dell'implementazione MyMemberDetailsService.

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

vedo che state includendo login-service.xml nel vostro spring-security.xml. Pertanto, la definizione del bean del servizio utente in login-service.xml risolverà il problema.

0

Come per il tutorial, web.xml deve contenere riferimento al file xml di configurazione primavera.

web.xml assomiglierà

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

Il xml MVC-dispatcher-servlet dovrebbe contenere l'importazione di tutti gli altri XMLs.

MVC-dispatcher-servlet XML sarà simile

<?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> 
Problemi correlati