2015-12-19 17 views
5

Tôi đang theo dõi this tutorial để sử dụng Bảo mật mùa xuân. Tôi muốn sử dụng Hibernate cho các truy vấn cơ sở dữ liệu. Tôi đã cấu hình mã nhưng ngoại lệ được ném.Mùa xuân ném ngoại lệ cho đậu không xác định

Tôi đã xác định hạt trong spring-security.xmlmy-servlet.xml nhưng vẫn không có kết quả.

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> 

mùa xuân-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

Hình như tập tin my-servlet.xml của bạn là thậm chí không tải (cần được xác định trong web.xml) – kryger

+0

@kryger tôi định nghĩa servlet-mapping –

+0

bạn cần định nghĩa 'myMemberDetailsService' làm bean. bạn có tệp spring-database.xml từ ví dụ trong dự án của bạn không? –

Trả lời

4

Tôi chỉ cần đọc hướng dẫn và tôi thấy nó không đề cập đến bất cứ điều gì về web.xml cấu hình, vì vậy tôi đã tải về nó để xem nó như thế nào đã được cấu hình.

Bạn đã nói, bạn đã cố gắng xác định myMemberDetailsService ở cả hai nơi, my-servletspring-security nhưng không hoạt động. Vâng, tôi nghĩ rằng đó là vấn đề về cấu hình vì vậy hãy thử thay đổi web.xml như sau (Tôi đã sử dụng tên bạn đã sử dụng trong câu hỏi của bạn, nhưng hãy kiểm tra xem có gì sai không?):

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

Và xóa toàn cầu <context-param> cho contextConfigLocation param nếu có.

Nếu điều này không hoạt động, tôi sẽ khuyên bạn nên sử dụng cấu hình tương tự như hướng dẫn, để nói, để cấu hình MVC tối thiểu thành my-servlet.xml và định cấu hình phần còn lại của hạt trong ngữ cảnh riêng biệt.

Hy vọng điều đó sẽ hữu ích!

0

Bao gồm UserDetailsService trong securityxml sẽ giải quyết vấn đề.

Trong số spring-security.xml của bạn bao gồm định nghĩa triển khai MyMemberDetailsService.

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

Tôi thấy rằng bạn đang bao gồm login-service.xml trong spring-security.xml. Vì vậy, việc xác định bean dịch vụ người dùng trong login-service.xml cũng sẽ giải quyết được sự cố.

0

Theo hướng dẫn, web.xml nên chứa tham chiếu đến cấu hình mùa xuân của bạn xml.

web.xml sẽ trông giống như

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

Mvc-dispatcher-servlet xml phải chứa tất cả các xml khác.

MVC-phối-servlet xml sẽ giống như

<?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> 
Các vấn đề liên quan