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 surMemberServiceImpl
? 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 pourMemberServiceImpl
. - 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).
Vous devez vous connecter pour publier un commentaire.
Je pense que vous oubliez pour ajouter cette annotation sur SecurityConfig Classe
et une choses de plus je pense que ce bean n'est pas besoin
S'il vous plaît essayer cette espère que cela va fonctionner pour vous..
Pour obtenir de l'utilisateur actuel
Grâce
Je pense que le problème pourrait être due à un manque
@ComponentScan
annotation. Lorsque vous essayez de autowireuserDetailsService
dansSecurityConfig
, il n'est pas en mesure de trouver une fève de autowire avec.Un printemps application a généralement un "contexte de l'application", en plus de "mvc " contexte", "contexte de sécurité" (que vous avez déjà via
SecurityConfig
), etc.Je ne sais pas si mettre
@ComponentScan
surSecurityConfig
elle fonctionne pas, mais vous pouvez lui donner un essai:Remplacer "your_base_package_name_here" avec le nom du paquet contenant votre
@Component
ou@Service
classes.Si cela ne fonctionne pas, ajoutez une nouvelle classe vide avec
@ComponentScan
annotation:Source: http://docs.spring.io/spring-javaconfig/docs/1.0.0.M4/reference/html/ch06s02.html
Voir il y a quelques erreurs dans votre base de code d'essayer de le résoudre en voyant le code ci-dessous.
Supprimer votre SecurityConfig fichier et le convertir en fichier xml de configuration.
Votre spring-security.xml devrait ressembler à ceci.
web.xml devrait être comme ceci:
Essayez d'ajouter la méthode suivante pour votre SecurityConfig:
Printemps ne peut pas trouver la fève avec le qualificatif
userDetailsService
.Je pense que vous devriez vérifier votre
applicationContext.xml
fichier dans le cas où si vous avez oublié de configurerUserDetailsService
's bean pour le Printemps de Sécurité.Si il n'y a alors essayer une nouvelle fois en retrait@Qualifier("userDetailsService")
.suivez ce lien.
context.xml fichier configuré à l'encontre de la sécurité printemps
Il semble que votre "userDetailsService" bean est déclaré @Autocâblés, mais il n'est pas disponible en tant que classe (MemberServiceImpl) dans le cadre de votre SecurityConfig.
Je suppose que dans votre MvcWebApplicationInitializer vous devez inclure MemberServiceImpl aussi:
Voici la réponse , en utilisant le bon @ComponentScan résoudre, ci-dessous un exemple de fragment de code suivant, je suis en collant qui j'ai aussi été confronté au même problème et résolu. Ci-dessous est résolu et travaille pour la question liée à la fève de création exception pour org.springframework.de sécurité.de base.userdetails.UserDetailsService
Etape 1: Écrire l'Application de Sécurité de la Configuration de la classe
Ici @ComponentScan n'est pas obligatoire dans LoginSecurityConfig , vous pouvez définir @ComponentScan dans la racine de config classe comme ci-dessous et de l'importation de la LoginSecurityConfig.class LoginSecurityConfig.
Etape 2: Maintenant permettra à l'autowiring de la SpringBean org.springframework.de sécurité.de base.userdetails.UserDetailsService
Essayez de changer le type de champ:
Je suis en utilisant le Guichet et a couru dans le même problème.
J'ai pu résoudre ce problème en changeing l'ordre dans mon AppInit Classe pour analyser le package d'abord, puis enregistrer l'appel de Haricots