package be.mentoringsystems.merke.security; import be.mentoringsystems.merke.model.db.Login; import be.mentoringsystems.merke.service.LoginService; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.stereotype.Component; /** * * @author anthonyarents */ @Component public class JWTAuthenticationFilter implements Filter { @Autowired private LoginService loginService; private static final Logger LOGGER = LogManager.getLogger(JWTAuthenticationFilter.class); @Override public void doFilter(final ServletRequest sr, final ServletResponse sr1, final FilterChain fc) throws IOException, ServletException { if (sr instanceof HttpServletRequest) { final HttpServletRequest hsr = (HttpServletRequest) sr; final HttpServletResponse hsr1 = (HttpServletResponse) sr1; String username = JWSHelper.getJwsSubject(hsr); Login login = loginService.getCurrentLogin(); if (username == null) { LOGGER.debug("found no jwt token"); if (login != null) { LOGGER.debug("user is logged in, making a new jwt token"); String token = JWSHelper.generateJwsWithSubject(login.getEmail()); hsr1.addHeader(JWSHelper.HEADER_NAME, JWSHelper.TOKEN_PREFIX + token); } } else { LOGGER.debug("found jwt token"); if (login == null) { UserDetails details = loginService.getByUsername(username); if (details != null) { details = loginService.loadUserByUsername(username); LOGGER.debug("user is not logged in, logging in as {0}", details.getUsername()); UsernamePasswordAuthenticationToken auth = new UsernamePasswordAuthenticationToken(details, null, details.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(auth); } } //hsr1.addHeader(JWSHelper.HEADER_NAME, JWSHelper.TOKEN_PREFIX + token); } } fc.doFilter(sr, sr1); } @Override public void init(final FilterConfig fc) throws ServletException { } @Override public void destroy() { } }