Spring Boot + REST Jersey (Agregando Spring Security 4) Parte 4


En el último post se explicó paso a paso la configuración de HATEOAS utilizando Spring boot Spring Boot + REST Jersey (Agregando Spring Hateoas y Dto) Parte 3, se tomará ese proyecto como base. Ahora se explicará de forma simple la configuración de Spring security, para este ejemplo se utilizará Basic authentication.

1. Configuración, Spring boot generó starter dependencies, estas dependencias contienen todos los recursos necesarios para utilizar el módulo de spring deseado de una forma simple y manejable de una forma más simple, las versiones de estas dependencias no son requeridas ya que se heredan del proyecto padre de spring boot. Para configurar Spring Security se requiere agregar la siguiente dependencia:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-security</artifactId>
</dependency>

2.Modificando nuestro repositorio, En el post Spring Boot + REST Jersey (Agregando Spring Hateoas y Dto) Parte 3 se crearon los repositorios UserRepository y RoleRepository. En este ejemplo se agregará un método a UserRepository que realizará una búsqueda de usuario por username.

/**
 *
 */
package com.raidentrance.repositories;

import org.springframework.data.repository.CrudRepository;
import com.raidentrance.entities.User;

/**
 * @author raidentrance
 *
 */
public interface UserRepository extends CrudRepository<User, Integer> {
	User findByUsername(String username);
}

No se debe realizar ninguna implementación de findByUsername, Spring data detectará en base a convención que se desea buscar un objeto Usuario a través del atributo username y realizará la implementación.

3. Agregando AuthenticatorService, AuthenticatorService será el responsable de realizar la autenticación en la aplicación, de tal modo que la lógica de esta clase será buscar al usuario en la base de datos así como su rol y devolverlo, la comparación entre el usuario y la contraseña enviada con lo que este autenticator devuelve será realizada por Spring.

/**
 *
 */
package com.raidentrance.service;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;
import com.raidentrance.entities.User;
import com.raidentrance.repositories.UserRepository;

/**
 * @author raidentrance
 *
 */
@Service
public class AuthenticatorService implements UserDetailsService {
	@Autowired
	private UserRepository userRepository;

	private static final Logger LOG = LoggerFactory.getLogger(AuthenticatorService.class);

	@Override
	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
		LOG.info("Trying to authenticate to {}", username);
		User user = userRepository.findByUsername(username);
		if (user == null) {
			throw new UsernameNotFoundException("Username " + username + " not found");
		} else {
			Collection<? extends GrantedAuthority> authorities = getGrantedAuthorities(user);
			return new org.springframework.security.core.userdetails.User(username, user.getPassword(), authorities);
		}
	}

	private Collection<? extends GrantedAuthority> getGrantedAuthorities(User user) {
		List<GrantedAuthority> list = new ArrayList<GrantedAuthority>();
		list.add(new GrantedAuthority() {
			private static final long serialVersionUID = 2409931876244987359L;
			@Override
			public String getAuthority() {
				return user.getRole().getName();
			}
		});
		return list;
	}
}

4. Configurando Spring security,el siguiente paso es configurar los endpoints que serán protegidos así como el mecanismo de autenticación a utilizar.

/**
 *
 */
package com.raidentrance.config;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import com.raidentrance.service.AuthenticatorService;

/**
 * @author raidentrance
 *
 */
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
	@Autowired
	private AuthenticatorService authenticatorService;

	@Autowired
	public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
		auth.userDetailsService(authenticatorService);
	}

	@Override
	protected void configure(HttpSecurity http) throws Exception {
		http.httpBasic().and().authorizeRequests().anyRequest().authenticated();
	}
}

El método configureGlobal es utilizado para definir quién va a realizar la búsqueda de los usuarios, para este ejemplo se utilizará  el AuthenticatorService creado previamente.

El método configure es utilizado para definir las url a las que se realizará la autenticación y que mecanismo se utilizará. En este caso al ser servicios web se realiza Basic authentication pero no es el único.

Enpoint:  http://localhost:8080/users

Header: Authorization Basic cmFpZGVudHJhbmNlOnN1cGVyU2VjcmV0

El valor header Authorization está compuesto del siguiente modo

Authorization Basic   : Nombre del header y tipo de autenticación.

cmFpZGVudHJhbmNlOnN1cGVyU2VjcmV0 : Valor, está compuesto del siguiente modo.

raidentrance:superSecret En base 64 de tal modo que :

raidentrance=username

superSecret=password

Probando utilizando CURL:

curl http://localhost:8080/users -XGET --user raidentrance:superSecret

Probando utilizando Postman

captura-de-pantalla-2016-09-08-a-las-10-14-35-a-m

captura-de-pantalla-2016-09-08-a-las-10-14-58-a-m

Puedes encontrar el código completo del ejemplo en el siguiente enlace:

https://github.com/raidentrance/spring-boot-example/tree/part4-adding-security

 

Autor: Alejandro Agapito Bautista

Twitter: @raidentrance

Contacto:raidentrance@gmail.com

Anuncios

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión /  Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión /  Cambiar )

Conectando a %s