Je dois authentifier les utilisateurs à partir de la base de données, les documents Spring Security ne disent pas comment s'authentifier avec Hibernate. Est-ce possible et comment puis-je faire cela?Spring Security 3 authentification de base de données avec Hibernate
Répondre
Vous devez créer votre propre fournisseur d'authentification personnalisé.
code Exemple:
service à la charge des utilisateurs de Hibernate:
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 UserDao 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);
}
}
service pour convertir votre entité à un objet utilisateur de printemps:
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.GrantedAuthorityImpl;
import org.springframework.security.core.userdetails.User;
@Service("assembler")
public class Assembler {
@Transactional(readOnly = true)
User buildUserFromUserEntity(UserEntity userEntity) {
String username = userEntity.getName();
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.getRoles()) {
authorities.add(new GrantedAuthorityImpl(role.getRoleName()));
}
User user = new User(username, password, enabled,
accountNonExpired, credentialsNonExpired, accountNonLocked, authorities, id);
return user;
}
}
Alors à base amespace-application contexte security.xml ressemblerait à quelque chose comme:
<http>
<intercept-url pattern="/login.do*" filters="none"/>
<intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<form-login login-page="/login.do"
authentication-failure-url="/login.do?error=failed"
login-processing-url="/login-please.do" />
<logout logout-url="/logoff-please.do"
logout-success-url="/logoff.html" />
</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="md5"/>
</authentication-provider>
</authentication-manager>
Merci pour la réponse bonne et détaillée avec pleine code. Pouvez-vous me dire pourquoi la classe Assembler est nécessaire, pourquoi ne pouvez-vous pas simplement mettre ce code dans la méthode loadUserByUsername ?? – newbie
Vous avez raison, il n'y a pas vraiment besoin de l'assembleur. Juste pensé que c'était une bonne idée de garder le userDetailsService simple et rendre la conversion réutilisable via le service assembleur. – Kdeveloper
vous pouvez également vérifier utiliser la méthode non obsolète de l'utilisateur http://static.springsource.org/spring-security/site/docs/3.0.x/apidocs/org/springframework/security/core/userdetails/User. html – Necronet
Une configuration java pourrait ressembler à ceci
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private UserDetailsServiceImpl userDetailsService;
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth)
throws Exception {
DaoAuthenticationProvider daoAuthenticationProvider =
new DaoAuthenticationProvider();
daoAuthenticationProvider
.setUserDetailsService(userDetailsService);
auth.authenticationProvider(daoAuthenticationProvider);
}
}
Si vous utilisez une base de données JDBC accessible, vous pourrait utiliser le fournisseur d'authentification suivant et éviter d'en créer un personnalisé. Il réduit le code requis 9 lignes de XML:
<authentication-provider>
<jdbc-user-service data-source-ref="dataSource" users-by-username-query="select username,password from users where username=?" authorities-by-username-query="select u.username, r.authority from users u, roles r where u.userid = r.userid and u.username =?" />
</authentication-provider>
Vous pouvez ensuite configurer votre dataSource comme suit
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/DB_NAME" />
<property name="username" value="root" />
<property name="password" value="password" />
</bean>
Jetez un oeil à ce poste: http://codehustler.org/blog/spring-security-tutorial-form-login/ Il couvre tout ce que vous devez savoir à propos de la personnalisation du formulaire de connexion Spring Security.
Pouvons-nous utiliser ceci avec des mots de passe hachés? – Rafael
Vous devriez être capable de hacher les mots de passe en utilisant
- 1. Spring Security Authentification de base HTTP
- 2. Comment configurer l'authentification de base de données Spring Security 2 avec les classes annotées Hibernate 3?
- 3. Authentification avec Spring Security avec usersByUsernameQuery
- 4. Spring Security 2.0.6 Authentification avec Active Directory
- 5. Spring Security 3.0 avec jdbc
- 6. Création d'une authentification personnalisée avec Acegi/Spring Security
- 7. Authentification à Spring Security après l'authentification sur Twitter/Facebook
- 8. Spring-Security avec X509?
- 9. Seam security avec authentification externe
- 10. Spring Security 3: Problème autowiring UserDetailsManager/JdbcUserDetailsManager
- 11. Spring Security UserDetails Meilleures pratiques
- 12. spring-security et jsf
- 13. JPA/Hibernate avec Oracle Label Security
- 14. Spring Security base Grails Plugin Problème
- 15. Raccourci/contournement Authentification Spring Security 2.0 à l'aide d'AuthenticationManager personnalisé
- 16. Spring Security Grails Plugin fonctionnant avec le schéma de base de données existant?
- 17. Utilisation de Tomcat NTLM avec Spring Security
- 18. ASP.NET MVC 3 + authentification Windows + Base de données Connexion chèque
- 19. Comment utiliser la hiérarchie des rôles dans Spring Security 3 avec Spring EL?
- 20. Spring Security + Active Directory
- 21. Spring Security: étape par étape
- 22. Spring Security Encrypt MD5
- 23. fichier basé Spring Security
- 24. Spring Security - CouchDB
- 25. data 'security' avec java et hibernate
- 26. Problème de sauvegarde de base de données avec Spring/Hibernate GenerationType.AUTO
- 27. Début avec Spring Hibernate
- 28. Spring Security ACL: NotFoundException de JDBCMutableAclService.createAcl
- 29. mise en cache des données utilisateur Spring Security LDAP sur la base de données locale
- 30. Deux domaines dans la même application avec Spring Security?
Voir http://stackoverflow.com/questions/2318467/how-do-i-configure-spring-security-2-database-authentication-with-hibernate-3-ann – axtavt