Agradeceríamos tu ayuda para difundir nuestras reseñas en referencia a las ciencias de la computación.
Solución:
Así es como pude implementar la autenticación basada en token y la autenticación básica
SpringSecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
@Override
public void configure(final AuthenticationManagerBuilder auth) throws Exception
auth.userDetailsService(this.participantService).passwordEncoder(this.passwordEncoder());
@Override
protected void configure(final HttpSecurity http) throws Exception
//Implementing Token based authentication in this filter
final TokenAuthenticationFilter tokenFilter = new TokenAuthenticationFilter();
http.addFilterBefore(tokenFilter, BasicAuthenticationFilter.class);
//Creating token when basic authentication is successful and the same token can be used to authenticate for further requests
final CustomBasicAuthenticationFilter customBasicAuthFilter = new CustomBasicAuthenticationFilter(this.authenticationManager() );
http.addFilter(customBasicAuthFilter);
TokenAuthenticationFilter.java
public class TokenAuthenticationFilter extends GenericFilterBean
@Override
public void doFilter(final ServletRequest request, final ServletResponse response, final FilterChain chain)
throws IOException, ServletException
final HttpServletRequest httpRequest = (HttpServletRequest)request;
//extract token from header
final String accessToken = httpRequest.getHeader("header-name");
if (null != accessToken)
//get and check whether token is valid ( from DB or file wherever you are storing the token)
//Populate SecurityContextHolder by fetching relevant information using token
final User user = new User(
"username",
"password",
true,
true,
true,
true,
authorities);
final UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
SecurityContextHolder.getContext().setAuthentication(authentication);
chain.doFilter(request, response);
CustomBasicAuthenticationFilter.java
@Component
public class CustomBasicAuthenticationFilter extends BasicAuthenticationFilter
@Autowired
public CustomBasicAuthenticationFilter(final AuthenticationManager authenticationManager)
super(authenticationManager);
@Override
protected void onSuccessfulAuthentication(final javax.servlet.http.HttpServletRequest request, final javax.servlet.http.HttpServletResponse response, final Authentication authResult)
//Generate Token
//Save the token for the logged in user
//send token in the response
response.setHeader("header-name" , "token");
Como nuestro CustomBasicAuthenticationFilter se configuró y agregó como un filtro a la seguridad de Spring,
Siempre que la autenticación básica sea exitosa, la solicitud se redirigirá a onSuccessfulAuthentication donde configuramos el token y lo enviamos en la respuesta con algún encabezado “nombre de encabezado”.
Si se envía “nombre de encabezado” para una solicitud adicional, la solicitud pasará primero por TokenAuthenticationFilter antes de intentar la autenticación básica.
Puede intentar configurar su personalizado AuthenticationToken
token en su filtro de autenticación, por ejemplo:
public class AuthenticationFilter extends GenericFilterBean
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
final String authTokenHeader = ((HttpServletRequest)request).getHeader(Constants.AUTH_HEADER_NAME);
if (authTokenHeader != null)
SecurityContextHolder.getContext().setAuthentication(createAuthenticationToken(authTokenHeader));
chain.doFilter( request, response );
Si te ha sido de utilidad nuestro artículo, sería de mucha ayuda si lo compartes con otros desarrolladores y nos ayudes a dar difusión a este contenido.