Comment faire pour configurer le Printemps de Sécurité pour accéder aux détails de l'utilisateur dans la base de données?

Je suis perplexe avec SpringSecurity. Il existe de nombreuses façons de mettre en œuvre une chose simple et j'ai mélangé tous.

Mon code est comme suit, mais il déclenche une exception. Si je supprime UserDetailsService les codes correspondants, l'application s'exécute et je peux me connecter in-memory utilisateurs. Comme indiqué ci-dessous, j'ai converti la configuration de base de XML, mais les utilisateurs ne peuvent pas signer dans.

org.springframework.beans.factory.BeanCreationException: Error creating bean 
with name 'securityConfig': Injection of autowired dependencies failed; nested 
exception is org.springframework.beans.factory.BeanCreationException: Could 
not autowire field:  
org.springframework.security.core.userdetails.UserDetailsService 
com.myproj.config.SecurityConfig.userDetailsService; nested exception is 
org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying 
bean of type    
[org.springframework.security.core.userdetails.UserDetailsService] found for 
dependency: expected at least 1 bean which qualifies as autowire candidate for 
this dependency. Dependency annotations: 
{@org.springframework.beans.factory.annotation.Autowired(required=true),  
@org.springframework.beans.factory.annotation.Qualifier(value=userDetailsService)}
Caused by: org.springframework.beans.factory.BeanCreationException: Could not 
autowire field 
org.springframework.security.core.userdetails.UserDetailsService 
com.myproj.config.SecurityConfig.userDetailsService; nested exception is 
org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type 
[org.springframework.security.core.userdetails.UserDetailsService] 
found for dependency: expected at least 1 bean which qualifies as autowire 
candidate for this dependency. Dependency annotations: 
{@org.springframework.beans.factory.annotation.Autowired(required=true), 
@org.springframework.beans.factory.annotation.Qualifier(value=userDetailsService)}
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: 
No qualifying bean of type 
[org.springframework.security.core.userdetails.UserDetailsService] found for 
dependency: expected at least 1 bean which qualifies as autowire candidate for 
this dependency. Dependency annotations: 
{@org.springframework.beans.factory.annotation.Autowired(required=true), 
@org.springframework.beans.factory.annotation.Qualifier(value=userDetailsService)}

Web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<listener>
<listener-class>org.apache.tiles.extras.complete.CompleteAutoloadTilesListener</listener-class>
</listener>
<servlet>
<servlet-name>proj</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>proj</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>

MvcWebApplicationInitializer

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class MvcWebApplicationInitializer
extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { SecurityConfig.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return null;
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}

SecurityWebApplicationInitializer

import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
public class SecurityWebApplicationInitializer
extends AbstractSecurityWebApplicationInitializer {
}

SecurityConfig

@Configuration
@EnableWebMvcSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
@Qualifier("userDetailsService")
UserDetailsService userDetailsService;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(
passwordEncoder());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/resources/**", "/", "/index", "/aboutus")
.permitAll()
.antMatchers("/profile/**")
.hasRole("USER")
.and()
.formLogin().loginPage("/signin").failureUrl("/signin?error")
.permitAll().and().logout().logoutUrl("/signout").permitAll();
}
@Bean
public PasswordEncoder passwordEncoder() {
PasswordEncoder encoder = new BCryptPasswordEncoder();
return encoder;
}
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception        
{
return super.authenticationManagerBean();
}
}

MemberServiceImpl

@Service("userDetailsService")
public class MemberServiceImpl implements UserDetailsService {
@Autowired
MemberRepository memberRepository;
private List<GrantedAuthority> buildUserAuthority(String role) {
Set<GrantedAuthority> setAuths = new HashSet<GrantedAuthority>();
setAuths.add(new SimpleGrantedAuthority(role));
List<GrantedAuthority> result = new ArrayList<GrantedAuthority>(
setAuths);
return result;
}
private User buildUserForAuthentication(Member member,
List<GrantedAuthority> authorities) {
return new User(member.getEmail(), member.getPassword(),
member.isEnabled(), true, true, true, authorities);
}
@Override
@Transactional(readOnly = true)
public UserDetails loadUserByUsername(String username)
throws UsernameNotFoundException {
Member member = memberRepository.findByUserName(username);
List<GrantedAuthority> authorities = buildUserAuthority("Role");
return buildUserForAuthentication(member, authorities);
}
}

Mise à jour de 1

Même après l'ajout d'annotation suivante, et authenticationManagerBean méthode de SecurityConfig la même exception est levée.

    @EnableGlobalMethodSecurity(prePostEnabled = true)

Mise à jour 2

Comme le suggère l'une des réponses, je les ai converti en XML en fonction de la configuration, le code actuel est le suivant;cependant, quand je soumettre un formulaire de connexion, il ne fait rien.

Spring-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.0.xsd">
<beans:import resource='login-service.xml' />
<http auto-config="true" access-denied-page="/notFound.jsp"
use-expressions="true">
<intercept-url pattern="/" access="permitAll" />
<form-login login-page="/signin" authentication-failure-url="/signin?error=1"
default-target-url="/index" />
<remember-me />
<logout logout-success-url="/index.jsp" />
</http>
<authentication-manager>
<authentication-provider>
<!-- <user-service> <user name="admin" password="secret" authorities="ROLE_ADMIN"/> 
<user name="user" password="secret" authorities="ROLE_USER"/> </user-service> -->
<jdbc-user-service data-source-ref="dataSource"
users-by-username-query="
select username,password,enabled 
from Member where username=?"
authorities-by-username-query="
select username 
from Member where username = ?" />
</authentication-provider>
</authentication-manager>
</beans:beans>

login-service.xml

<beans xmlns="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">
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost/testProject" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
</beans>
  • D'un côté, vous dites que vous voulez de Printemps de sécurité pour récupérer les utilisateurs de DB, et d'autre part vous dites et je cite " j'ai besoin d'avoir accès à des utilisateurs dans la base de données en utilisant Hibernate.'.. Qui un que c'est exactement? Et votre code semble très bien pour la connexion. De quoi êtes-vous exactement en essayant de tirer ici?
  • la question est reformulée. Je suis à l'aide de spring security et j'ai besoin de lire les informations des utilisateurs à partir de db. Mon ORM est ici mise en veille prolongée.
  • Comment êtes-vous ramasser la @Service annotation sur MemberServiceImpl? En général, vous ajoutez un @ComponentScan annotation à ramasser ça. Si vous avez ajouté, s'il vous plaît inclure tous les noms de package pour la configuration avec @ComponentScan et pour MemberServiceImpl.
  • Essayez ceci : sivalabs.in/2014/03/springmvc4-spring-data-jpa.html
  • ce tutoriel fait trop compliqué. Savez-vous de mieux?
  • pour votre question.. si vs avez besoin de plus d'aide de commentaires sur moi.
  • Voulez-vous mon code sur github..dois-je télécharger
  • Je serais très reconnaissant si vous pouvez partager un lien.
  • Ok..Voici le lien. Nous avons téléchargeable projet également. Toute erreur et le doute des commentaires sur moi..dineshonjava.com/2013/02/... .
  • Toutes les exigences de base de données sont sur ce lien lui-même
  • apprécier qui va vérifier ça.
  • Ici vous pouvez télécharger des tas de Printemps de sécurité des fichiers jar. Ne pas utiliser une version différente de fichiers jar pour le printemps et le printemps de sécurité..utiliser la même version.. u pouvez télécharger ici..maven.springframework.org/release/org/springframework/security
  • désolé j'ai oublié, je vais vous donner une prime de 200 eh bien, si ça résout mon problème.
  • Garder commentant sur moi.. je vais résoudre vos problèmes
  • hey commentaire sur moi si u avez des doutes.. seulement 14hrs à gauche
  • Je suis toujours il câblage jusqu'. Qu'entendez-vous par 14hrs à gauche?
  • c'est la prime de fin
  • ne vous inquiétez pas à ce sujet, si votre solution résout mon problème, je vais vous proposer un autre bounty 🙂
  • Il n'est pas nécessaire de passer à xml. Java configuration ressemble beaucoup plus agréable, le passage à xml pour résoudre un problème est stupide et un indicateur que vous avez aucune idée de ce que vous faites. Vous n'avez donc obtenir votre problème résolu encore? Je vois quelques bonnes réponses ici, mais je suis actuellement sur mobile, si ce n'est pas résolu d'ici demain, je vais poster un exemple de travail. Bonne chance.
  • merci pour votre commentaire, je suis passé à xml dans l'espoir de résoudre ce problème plus rapidement que je fais affaire avec elle pour un long moment maintenant, aussi, j'ai l'habitude de travailler avec XML en fonction de la sécurité de l'an dernier mais j'ai presque oublié le nombre de parties. Je pensais peut-être en souvenir de tout, mais pas encore.; cependant, je suis toujours avoir des problèmes différents. Je ne pouvais pas trouver un exemple de travail!!!, et ça me rend fou. Il serait très apprécié si vous me donner un exemple de travail afin que je puisse comprendre comment il fonctionne et ce que je faisais mal! Il semble que près de 19 personnes sont à la recherche pour le même résultat ainsi.
  • Pas sûr au sujet de la question précise que vous êtes maintenant face, mais essayez d'ajouter le numéro de port dans la base de données d'URL. Changement jdbc:mysql://localhost/testProject à jdbc:mysql://localhost:3306/testProject (ou n'importe quel port vous exécutez l'application sur).