mongotemplate example data conectar con java spring mongodb spring-security mongodb-java

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); } }