Проблема со Spring security + hibernate

 
 
 
Сообщения:7
Привет всем!
Уже 3й день пытаюсь реализовать авторизацию пользователей с помощью spring security.
При реализации совместил эти 2 мана:
http://stackoverflow.com/questions/2683308/spring-security-3-database-authentication-with-hibernate
http://j2w.blogspot.com/2008/10/spring-security-2.html

Но, как ни странно, не работает.
Помогите пожалуйста!!!

Трейс ошибки:
java.lang.NullPointerException
	net.inver.productmanager.service.UserDetailsServiceImpl.loadUserByUsername(UserDetailsServiceImpl.java:32)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
	org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
	org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)
	org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
	org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
	$Proxy15.loadUserByUsername(Unknown Source)
	org.springframework.security.authentication.dao.DaoAuthenticationProvider.retrieveUser(DaoAuthenticationProvider.java:86)
	org.springframework.security.authentication.dao.AbstractUserDetailsAuthenticationProvider.authenticate(AbstractUserDetailsAuthenticationProvider.java:129)
	org.springframework.security.authentication.ProviderManager.doAuthentication(ProviderManager.java:130)
	org.springframework.security.authentication.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:48)
	org.springframework.security.authentication.ProviderManager.doAuthentication(ProviderManager.java:148)
	org.springframework.security.authentication.AbstractAuthenticationManager.authenticate(AbstractAuthenticationManager.java:48)
	org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter.attemptAuthentication(UsernamePasswordAuthenticationFilter.java:97)
	org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:105)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:79)
	org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:380)
	org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:169)
	org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:237)
	org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:167)


Модель данных:
package net.inver.productmanager.domain;

import javax.persistence.*;

@Entity
@Table(name = "users")
public class User{

    @Id
    @GeneratedValue
    @Column(name = "id")
    public Integer getId() { return id; }
    public void setId(Integer id) { this.id = id; }
    private Integer id;

    @Column(name = "fio")
    public String getFio() { return fio; }
    public void setFio(String fio) { this.fio = fio; }
    private String fio;

    @Column(name = "username")
    public String getUsername() { return username; }
    public void setUsername(String username) { this.username = username; }
    private String username;

    @Column(name = "password")
    public String getPassword() { return password; }
    public void setPassword(String password) { this.password = password; }
    private String password;

    @ManyToOne @JoinColumn(name = "selling_point_id")
    public SellingPoint getSellingPoint() { return sellingPoint; }
    public void setSellingPoint(SellingPoint sellingPoint) { this.sellingPoint = sellingPoint; }
    private SellingPoint sellingPoint;
}


UserDAO
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class UserDAOImpl implements  UserDAO{
    @Autowired
    private SessionFactory sessionFactory;// = new AnnotationConfiguration().configure().buildSessionFactory();

    @Override
    public List<User> listAllUsers() {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public List<User> listUsersBySellingPont(SellingPoint sellingPoint) {
        return null;  //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public User getUserByUsername(String username) {
        Session session = sessionFactory.getCurrentSession();
        session.beginTransaction();
        List<User> users = session.createQuery("from User").list();
        User result = null;
        for(User user: users) {
            if(user.getUsername().equals(username))
                result = user;
        }
        session.getTransaction().commit();
        return result;
    }

    @Override
    public void addUser(User user) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public void updateUser(User user) {
        //To change body of implemented methods use File | Settings | File Templates.
    }

    @Override
    public void delUser(Integer id) {
        //To change body of implemented methods use File | Settings | File Templates.
    }
}


UserDetailsServiceImpl
package net.inver.productmanager.service;

import net.inver.productmanager.dao.UserDAO;
import net.inver.productmanager.dao.UserDAOImpl;
import net.inver.productmanager.domain.User;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataAccessException;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Component
@Transactional
public class UserDetailsServiceImpl implements UserDetailsService{

    @Autowired
    private UserDAO userDAO;/* = new UserDAOImpl();*/

    @Autowired
    private UserAssembler userAssembler;

    private static final Logger logger = LoggerFactory.getLogger(UserDetailsServiceImpl.class);

    @Transactional(readOnly = true)
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
        User user = userDAO.getUserByUsername(username);

        if(null == user) throw new UsernameNotFoundException("Пользователь не найден");

        return userAssembler.buildUserFromUser(user);
    }
}


UserAssembler
package net.inver.productmanager.service;

import net.inver.productmanager.dao.UserDAO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.Collection;

@Service("assembler")
public class UserAssembler {

    @Autowired
    private UserDAO userDAO;

    @Transactional(readOnly = true)
    public User buildUserFromUser(net.inver.productmanager.domain.User user) {
        String role = "ROLE_USER";//userEntityDAO.getRoleFromUserEntity(userEntity);

        Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        authorities.add(new GrantedAuthorityImpl(role));

        return new User(user.getUsername(), user.getPassword(), true, true, true, true,  authorities);
    }
}


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


<beans:beans xmlns="http://www.springframework.org/schema/security"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:beans="http://www.springframework.org/schema/beans"
  xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/security
http://www.springframework.org/schema/security/spring-security-3.0.xsd">
	<http auto-config="true" use-expressions="true">
        <intercept-url pattern="/login" access="permitAll"/>
        <intercept-url pattern="/*" access="hasRole('ROLE_USER')" />
        <form-login login-page="/login" />
        <remember-me key="jbcpPetStore"/>
        <logout invalidate-session="true" logout-success-url="/" logout-url="/logout" />
    </http>

     <beans:bean id="myUserDetailsService" class="net.inver.productmanager.service.UserDetailsServiceImpl" />


    <authentication-manager alias="authenticationManager">
        <authentication-provider user-service-ref="myUserDetailsService" />
    </authentication-manager>
</beans:beans>
 
 
Сообщения:428
inver:

public class UserDetailsServiceImpl implements UserDetailsService{

    @Autowired
    private UserDAO userDAO;/* = new UserDAOImpl();*/

    @Transactional(readOnly = true)
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException {
        User user = userDAO.getUserByUsername(username);



user здесь точно не null? (если да, то значит @Autiwired его по какой-то причине не про-set-ил)

P.S. Кстати, есть ещё туториалы на http://krams915.blogspot.com/search/label/Security
 
 
Сообщения:7
За туториалы спасибо!
user как раз равен null, ибо не инициализируется почему-то userDAO.
Если я его принудительно инициализирую, то не инициализируется сессия в этом дао.
А вот почему так? и как это обойти?
 
 
Сообщения:428
inver:
За туториалы спасибо!
user как раз равен null, ибо не инициализируется почему-то userDAO.
Если я его принудительно инициализирую, то не инициализируется сессия в этом дао.
А вот почему так? и как это обойти?


Нужно разобраться почему @Autowired не отработал. Включайте debug и смотрите в логе.

Например, прописан ли у вас в context:component-scan пакет в котором находится класс UserDAOImpl? Также возможно, что у вас в контексте два или более классов, которые реализуют интерфейс UserDAO (в этом случае используйте @Qualifier).

Всё это уже не раз описывалось в интернете, например, здесь: http://stackoverflow.com/questions/3153546/how-does-autowiring-work-in-spring
 
 
Сообщения:7
Quote:

Например, прописан ли у вас в context:component-scan пакет в котором находится класс UserDAOImpl? Также возможно, что у вас в контексте два или более классов, которые реализуют интерфейс UserDAO (в этом случае используйте @Qualifier).


php-coder, спасибо!
Так и было. В контексте сервлетов происходил поиск контроллеров, а в root-context.xml этого поиска не было. Добавил context:component-scan и все заработало!
 
Модераторы:wedens
Сейчас эту тему просматривают:Нет