我正在尝试使用数据库表在Spring应用程序中应用安全性。
到目前为止,我的applicationContext-Security中有:
<beans:bean id="userDetailsService" class="org.intan.pedigree.service.UserDetailsServiceImpl"></beans:bean> <http auto-config='true'> <intercept-url pattern="/**" access="ROLE_USER" /> </http> <beans:bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> <beans:property name="userDetailsService" ref="userDetailsService" /> </beans:bean> <beans:bean id="authenticationManager" class="org.springframework.security.authentication.ProviderManager"> <beans:property name="providers"> <beans:list> <beans:ref local="daoAuthenticationProvider" /> </beans:list> </beans:property> </beans:bean> <authentication-manager> <authentication-provider user-service-ref="userDetailsService"> <password-encoder hash="plaintext" /> </authentication-provider> </authentication-manager>
我对userDetailsService的实现如下所示:
package org.intan.pedigree.service; import org.intan.pedigree.dao.UserEntityDAO; import org.intan.pedigree.dao.UserEntityDAOImpl; import org.intan.pedigree.form.UserEntity; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.dao.DataAccessException; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; @Service("userDetailsService") public class UserDetailsServiceImpl implements UserDetailsService { @Autowired private UserEntityDAO dao; @Autowired private Assembler assembler; @Transactional(readOnly = true) public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { UserDetails userDetails = null; UserEntity userEntity = dao.findByName(username); if (userEntity == null) throw new UsernameNotFoundException("user not found"); return assembler.buildUserFromUserEntity(userEntity); } }
我的汇编程序如下所示:
package org.intan.pedigree.service; import java.util.ArrayList; import java.util.Collection; import org.intan.pedigree.form.SecurityRoleEntity; import org.intan.pedigree.form.UserEntity; //import org.springframework.security.core.GrantedAuthority; //import org.springframework.security.core.authority.GrantedAuthorityImpl; //import org.springframework.security.core.userdetails.User; 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; @Service("assembler") public class Assembler { @Transactional(readOnly = true) User buildUserFromUserEntity(UserEntity userEntity) { String username = userEntity.getUsername(); String password = userEntity.getPassword(); boolean enabled = userEntity.isActive(); boolean accountNonExpired = userEntity.isActive(); boolean credentialsNonExpired = userEntity.isActive(); boolean accountNonLocked = userEntity.isActive(); Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); for (SecurityRoleEntity role : userEntity.getUserSecurityRoleEntity()) { authorities.add(new GrantedAuthorityImpl(role.getName())); } User user = new User(username, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); return user; } }
现在,用户实体为:
package org.intan.pedigree.form; import java.util.Date; import java.util.HashSet; import java.util.Set; import javax.persistence.CascadeType; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.JoinColumn; import javax.persistence.JoinTable; import javax.persistence.OneToMany; import javax.persistence.Table; import javax.validation.constraints.NotNull; @Entity @Table(name="user") public class UserEntity { @Id @GeneratedValue @Column(name="ID") private int id; @Column(name="first_name") private String first_name; @Column(name="family_name") private String last_name; @Column(name="dob") private Date dob; @Column(name="password") private String password; @Column(name="username") private String username; @Column(name="active") @NotNull private boolean isActive; @Column(name="user_types_id") private int user_types_id; @Column(name="confirm_password") public String confirmPassword; @OneToMany(cascade = CascadeType.ALL) @JoinTable(name = "user_address", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "address_id") }) private Set<Address> userAddress = new HashSet<Address>(0); /*******************************************************************************/ @OneToMany(cascade = CascadeType.ALL) @JoinTable(name = "user_security_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "security_role_id") }) private Set<SecurityRoleEntity> userSecurityRoleEntity = new HashSet<SecurityRoleEntity>(0); public Set<Address> getUserAddress(){ return this.userAddress; } public void setUserAddress(Set<Address> userAddress) { this.userAddress = userAddress; } /*****************************************************************************/ public Set<SecurityRoleEntity> getUserSecurityRoleEntity(){ return this.userSecurityRoleEntity; } public void setUserSecurityRoleEntity(Set<SecurityRoleEntity> userSecurityRoleEntity) { this.userSecurityRoleEntity = userSecurityRoleEntity; } public boolean isActive() { return isActive; } public void setActive(boolean isActive) { this.isActive = isActive; } public String getConfirmPassword() { return confirmPassword; } public void setConfirmPassword(String confirmPassword) { this.confirmPassword = confirmPassword; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getFirst_name() { return first_name; } public void setFirst_name(String first_name) { this.first_name = first_name; } public String getLast_name() { return last_name; } public void setLast_name(String last_name) { this.last_name = last_name; } public Date getDob() { return dob; } public void setDob(Date dob) { this.dob = dob; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public int getUser_types_id() { return user_types_id; } public void setUser_types_id(int user_types_id) { this.user_types_id = user_types_id; } }
我的userentitydao界面是:
package org.intan.pedigree.dao; import java.util.List; import org.intan.pedigree.form.UserEntity; public interface UserEntityDAO { public void removeUserEntity(Integer id); public List<UserEntity> listUserEntity() ; public void addUserEntity(UserEntity user) ; public void updateUserEntity(UserEntity user) ; public UserEntity getUserEntityByID(Integer id); public UserEntity findByName(String username); }
实现是:
@Repository public class UserEntityDAOImpl implements UserEntityDAO{ @Autowired private SessionFactory sessionFactory; public void addUserEntity(UserEntity user) { try { sessionFactory.getCurrentSession().save(user); } catch (Exception e) { System.out.println(e); } } public UserEntity findByName(String username) { UserEntity user = (UserEntity) sessionFactory.getCurrentSession().createQuery( "select u form user u where u.username = '" + username + "'"); return user; } public UserEntity getUserEntityByID(Integer id) { UserEntity user = (UserEntity) sessionFactory.getCurrentSession().createQuery( "select u form user u where id = '" + id + "'"); return user; } public void updateUserEntity(UserEntity user) { try { sessionFactory.getCurrentSession().update(user); } catch (Exception e) { System.out.println(e); } } public List<UserEntity> listUserEntity() { return sessionFactory.getCurrentSession().createQuery("from User") .list(); } public void removeUserEntity(Integer id) { UserEntity user = (UserEntity) sessionFactory.getCurrentSession().load( UserEntity.class, id); if (null != user) { sessionFactory.getCurrentSession().delete(user); } } }
现在,当我尝试在tomcat上进行部署时,出现以下异常:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'userDetailsService': Injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.intan.pedigree.dao.UserEntityDAO org.intan.pedigree.service.UserDetailsS erviceImpl.dao; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching bean of type [org.intan.pedigree.dao.UserEntityDAO] found for dependency: expected at least 1 bean which qualifies as autowire candidate for this dependency. Dependency annotations: {@org.springframework.beans.factory.annotatio n.Autowired(required=true)}
而不管我该怎么办,我不知道这是怎么回事。任何的建议都受欢迎。
非常感谢
在您的上下文中,我看不到任何关于UserEntityDAOImpl或的声明Assembler,也没有组件扫描来自动检测到它。
UserEntityDAOImpl
Assembler
您需要在旁边声明它们UserDetailsServiceImpl,或在<context:component-scan>某处添加一个。
UserDetailsServiceImpl
<context:component-scan>