example - spring boot mongodb java configuration
Autenticación con Spring Security+Spring data+MongoDB (2)
Quiero usar la seguridad de Spring con MongoDB (usando datos de Spring) y recuperar a los usuarios de mi propia base de datos para la seguridad de Spring Sin embargo, no puedo hacer eso ya que mi tipo de servicio de usuarios no parece ser compatible.
Esta es mi clase de UserService:
public class UserService {
private ApplicationContext applicationContext;
private MongoOperations mongoOperations;
public UserService() {
applicationContext = new AnnotationConfigApplicationContext(MongoConfig.class);
mongoOperations = (MongoOperations) applicationContext.getBean("mongoTemplate");
}
public User find(String username) {
return mongoOperations.findOne(Query.query(Criteria.where("username").is(username)), User.class);
}
}
Y mi clase SecurityConfig:
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
UserService userService;
@Autowired
public void configAuthBuilder(AuthenticationManagerBuilder builder) throws Exception {
builder.userDetailsService(userService); //THIS DOES NOT WORK
builder.inMemoryAuthentication().withUser("username").password("password").roles("USER");
}
}
La línea que comenté dice:
The inferred type UserService is not a valid substitute for the bounded parameter <T extends UserDetailsService>.
¿Cómo puedo solucionarlo para poder recuperar a los usuarios de mi propia base de datos?
Cree su propio proveedor de autenticación proporcionando una clase que amplíe el servicio UserDetailservice. Asegúrese de que el análisis de contenido esté habilitado en su archivo xml de contexto de Spring.
<authentication-provider user-service-ref="userModelService">
<password-encoder hash="sha" />
</authentication-provider>
@Service
public class UserModelService implements UserDetailsService
{
@Autowired
private UserModelRepositoryImpl repository;
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
{
UserModel user = repository.findByUsername(username);
if( user == null )
throw new UsernameNotFoundException( "Name not found!" );
List<SimpleGrantedAuthority> authorities = Arrays.asList(new SimpleGrantedAuthority( user.getRole()));
return new User(user.getUsername(), user.getSHA1Password(), authorities );
}
public void saveUserDetails(UserModel userModel)
{
repository.save(userModel);
}
}
Esta clase habilitará el mongo de consulta Spring para el nombre de usuario y la contraseña necesarios para la autenticación. A continuación, crea la clase de modelo de usuario.
public class UserModel
{
private String id;
@Indexed(unique=true)
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
Cree la clase de implementación de usuario que amplíe el DAO.
@Service
public class UserModelService implements UserDetailsService
{
@Autowired
private UserModelRepositoryImpl repository;
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException
{
UserModel user = repository.findByUsername(username);
if( user == null )
throw new UsernameNotFoundException( "Oops!" );
List<SimpleGrantedAuthority> authorities = Arrays.asList(new SimpleGrantedAuthority( user.getRole()));
return new User(user.getUsername(), user.getSHA1Password(), authorities );
}
Finalmente configura mongo y listo.
Capa de servicio
org.springframework.security.core.userdetails.UserDetailsService
crear un service
independiente service
implemente org.springframework.security.core.userdetails.UserDetailsService
e inyectarlo dentro de AuthenticationManagerBuilder
.
@Component
public class SecUserDetailsService implements UserDetailsService{
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
/*Here add user data layer fetching from the MongoDB.
I have used userRepository*/
User user = userRepository.findByUsername(username);
if(user == null){
throw new UsernameNotFoundException(username);
}else{
UserDetails details = new SecUserDetails(user);
return details;
}
}
}
Modelo
UserDetails
deben ser implementados. Este es el POJO que mantendrá los detalles autenticados del usuario por Spring. Puede incluir su objeto de datos de Entidad envuelto dentro de él, como lo he hecho.
public class SecUserDetails implements UserDetails {
private User user;
public SecUserDetails(User user) {
this.user = user;
}
......
......
......
}
Configuración de seguridad
Encienda automáticamente el servicio que creamos anteriormente y configúrelo dentro de AuthenticationManagerBuilder
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
SecUserDetailsService userDetailsService ;
@Autowired
public void configAuthBuilder(AuthenticationManagerBuilder builder) throws Exception {
builder.userDetailsService(userDetailsService);
}
}