Skip to content

Commit 221ecda

Browse files
Refatorando autenticação: - Corrigido erros em cliente e sistema que estavam logando de maneiras mistas. - Refatorado nome Usuario para cliente
1 parent b6198b6 commit 221ecda

20 files changed

+164
-109
lines changed

testeSantanderWay/src/main/java/br/com/testesantanderway/TesteSantanderWayApplication.java

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,12 +12,12 @@
1212
@EnableSpringDataWebSupport
1313
@EnableCaching
1414
public class TesteSantanderWayApplication {
15-
// @PostConstruct
16-
// void started(){
17-
// TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
18-
// }
15+
@PostConstruct
16+
void started() {
17+
TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
18+
}
1919

20-
public static void main(String[] args) {
21-
SpringApplication.run(TesteSantanderWayApplication.class, args);
22-
}
20+
public static void main(String[] args) {
21+
SpringApplication.run(TesteSantanderWayApplication.class, args);
22+
}
2323
}

testeSantanderWay/src/main/java/br/com/testesantanderway/config/security/AutenticacaoService.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
package br.com.testesantanderway.config.security;
22

3+
import br.com.testesantanderway.modelo.Cliente;
34
import br.com.testesantanderway.modelo.Sistema;
45
import br.com.testesantanderway.repository.SistemaRepository;
6+
import br.com.testesantanderway.repository.ClienteRepository;
57
import org.springframework.beans.factory.annotation.Autowired;
68
import org.springframework.security.core.userdetails.UserDetails;
79
import org.springframework.security.core.userdetails.UserDetailsService;
@@ -14,14 +16,23 @@
1416
public class AutenticacaoService implements UserDetailsService {
1517

1618
@Autowired
17-
private SistemaRepository repository;
19+
private SistemaRepository sistemaRepository;
20+
21+
@Autowired
22+
private ClienteRepository clienteRepository;
1823

1924
@Override
2025
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
21-
Optional<Sistema> clientePorEmail = repository.findByEmail(username);
26+
Optional<Sistema> sistema = sistemaRepository.findByEmail(username);
27+
28+
if (sistema.isPresent()) {
29+
return sistema.get();
30+
}
31+
32+
Optional<Cliente> usuario = clienteRepository.findByEmail(username);
2233

23-
if (clientePorEmail.isPresent()){
24-
return clientePorEmail.get();
34+
if (usuario.isPresent()) {
35+
return usuario.get();
2536
}
2637

2738
throw new UsernameNotFoundException("Dados Inválidos");

testeSantanderWay/src/main/java/br/com/testesantanderway/config/security/AutenticacaoSistemaViaTokenFilter.java renamed to testeSantanderWay/src/main/java/br/com/testesantanderway/config/security/AutenticacaoViaTokenFilter.java

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,64 +1,71 @@
11
package br.com.testesantanderway.config.security;
22

3+
import br.com.testesantanderway.modelo.Cliente;
34
import br.com.testesantanderway.modelo.Sistema;
4-
import br.com.testesantanderway.modelo.Usuario;
55
import br.com.testesantanderway.repository.SistemaRepository;
6-
import br.com.testesantanderway.repository.UsuarioRepository;
7-
import org.springframework.beans.factory.annotation.Autowired;
6+
import br.com.testesantanderway.repository.ClienteRepository;
87
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
98
import org.springframework.security.core.context.SecurityContextHolder;
109
import org.springframework.web.filter.OncePerRequestFilter;
10+
1111
import javax.servlet.FilterChain;
1212
import javax.servlet.ServletException;
1313
import javax.servlet.http.HttpServletRequest;
1414
import javax.servlet.http.HttpServletResponse;
1515
import java.io.IOException;
16-
import java.util.Arrays;
16+
import java.util.Optional;
1717

1818
public class AutenticacaoViaTokenFilter extends OncePerRequestFilter {
1919

2020
private static final String BEARER = "Bearer ";
2121

22-
@Autowired
2322
private ServicoDeToken tokenService;
2423

25-
@Autowired
2624
private SistemaRepository sistemaRepository;
2725

28-
@Autowired
29-
private UsuarioRepository usuarioRepository;
26+
private ClienteRepository clienteRepository;
27+
28+
public AutenticacaoViaTokenFilter(ServicoDeToken tokenService, SistemaRepository sistemaRepository, ClienteRepository clienteRepository) {
29+
this.tokenService = tokenService;
30+
this.sistemaRepository = sistemaRepository;
31+
this.clienteRepository = clienteRepository;
32+
}
3033

3134
@Override
3235
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response,
3336
FilterChain filterChain) throws ServletException, IOException {
3437
String token = AutenticacaoViaTokenFilter.recuperarToken(request);
35-
boolean valido = tokenService.isTokenValido(token);
36-
if (valido){
37-
autenticarUsuario(token);
38+
39+
if (token != null && tokenService.isTokenValido(token)) {
40+
autenticar(token);
3841
}
3942

4043
filterChain.doFilter(request, response);
4144
}
4245

43-
private void autenticarUsuario(String token) {
44-
String codigoUsuario = tokenService.getCodigo(token);
45-
Usuario usuario = usuarioRepository.findById(codigoUsuario).get();
46-
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(usuario,
47-
null, Arrays.asList(() -> "USUARIO"));
48-
SecurityContextHolder.getContext().setAuthentication(authentication);
49-
}
46+
private void autenticar(String token) {
47+
String codigo = tokenService.getCodigo(token);
48+
49+
UsernamePasswordAuthenticationToken authentication = null;
50+
Optional<Sistema> sistema = sistemaRepository.findById(codigo);
51+
if(sistema.isPresent()){
52+
authentication = new UsernamePasswordAuthenticationToken(sistema,
53+
null, sistema.get().getAuthorities());
54+
}else{
55+
Optional<Cliente> cliente = clienteRepository.findById(codigo);
56+
57+
if(cliente.isPresent()){
58+
authentication = new UsernamePasswordAuthenticationToken(sistema,
59+
null, cliente.get().getAuthorities());
60+
}
61+
}
5062

51-
private void autenticarSistema(String token) {
52-
String codigoSistema = tokenService.getCodigo(token);
53-
Sistema sistema = sistemaRepository.findById(codigoSistema).get();
54-
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(sistema,
55-
null, sistema.getAuthorities());
5663
SecurityContextHolder.getContext().setAuthentication(authentication);
5764
}
5865

5966
public static String recuperarToken(HttpServletRequest request) {
6067
String token = request.getHeader("Authorization");
61-
if (token == null || token.isEmpty() || !token.startsWith(BEARER)){
68+
if (token == null || token.isEmpty() || !token.startsWith(BEARER)) {
6269
return null;
6370
}
6471

testeSantanderWay/src/main/java/br/com/testesantanderway/config/security/ConfigSeguranca.java

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package br.com.testesantanderway.config.security;
22

33
import br.com.testesantanderway.repository.SistemaRepository;
4+
import br.com.testesantanderway.repository.ClienteRepository;
45
import org.springframework.beans.factory.annotation.Autowired;
56
import org.springframework.context.annotation.Bean;
67
import org.springframework.context.annotation.Configuration;
@@ -20,14 +21,19 @@
2021
public class ConfigSeguranca extends WebSecurityConfigurerAdapter {
2122
@Autowired
2223
private AutenticacaoService autenticacaoService;
24+
2325
@Autowired
24-
private ServicoDeToken tokenService;
26+
private ClienteRepository clienteRepository;
27+
2528
@Autowired
2629
private SistemaRepository sistemaRepository;
2730

31+
@Autowired
32+
private ServicoDeToken tokenService;
33+
2834
@Override
2935
@Bean
30-
protected AuthenticationManager authenticationManager() throws Exception{
36+
protected AuthenticationManager authenticationManager() throws Exception {
3137
return super.authenticationManager();
3238
}
3339

@@ -41,20 +47,18 @@ protected void configure(AuthenticationManagerBuilder auth) throws Exception {
4147
@Override
4248
protected void configure(HttpSecurity http) throws Exception {
4349
http.authorizeRequests()
44-
.antMatchers(HttpMethod.GET,"/clientes/*").permitAll()
45-
.antMatchers(HttpMethod.GET,"/gastos/*").permitAll()
46-
.antMatchers(HttpMethod.GET,"/usuarios/*").permitAll()
47-
.antMatchers(HttpMethod.POST,"/usuarios/*").permitAll()
48-
.antMatchers(HttpMethod.POST,"/auth").permitAll()
49-
.antMatchers(HttpMethod.GET,"/actuator/**").permitAll()
50+
.antMatchers(HttpMethod.POST, "/auth/**").permitAll()
51+
.antMatchers("/user/**").hasAnyAuthority("USUARIO")
52+
.antMatchers("/sistema/**").hasAnyAuthority("SISTEMA")
5053
.antMatchers(
5154
"/v2/api-docs", "/swagger-resources/**", "/swagger-ui.html", "/webjars/**",
5255
"/swagger.json")
5356
.permitAll()
5457
.anyRequest().authenticated()
5558
.and().csrf().disable()
5659
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
57-
.and().addFilterBefore(new AutenticacaoViaTokenFilter(tokenService, sistemaRepository), UsernamePasswordAuthenticationFilter.class);
60+
.and()
61+
.addFilterBefore(new AutenticacaoViaTokenFilter(tokenService, sistemaRepository, clienteRepository), UsernamePasswordAuthenticationFilter.class);
5862
}
5963

6064
//Recursos estáticos(js, css, img, etc.)

testeSantanderWay/src/main/java/br/com/testesantanderway/config/security/ServicoDeToken.java

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,57 @@
11
package br.com.testesantanderway.config.security;
22

3+
import br.com.testesantanderway.modelo.Cliente;
34
import br.com.testesantanderway.modelo.Sistema;
45
import io.jsonwebtoken.Claims;
56
import io.jsonwebtoken.Jwts;
67
import io.jsonwebtoken.SignatureAlgorithm;
78
import org.springframework.beans.factory.annotation.Value;
9+
import org.springframework.boot.actuate.trace.http.HttpTrace;
810
import org.springframework.security.core.Authentication;
911
import org.springframework.stereotype.Service;
1012

1113
import java.util.Date;
1214

1315
@Service
1416
public class ServicoDeToken {
17+
public static String USUARIO_TESTE = "12615a2f-92a3-4bfd-a6f3-5a352b65438b";
18+
1519
@Value("${testeSantanderWay.jwt.expiration}")
1620
private String expiracao;
1721
@Value("${testeSantanderWay.jwt.secret}")
1822
private String secret;
1923

20-
public String gerarToken(Authentication authentication) {
21-
Sistema sistemaLogado = (Sistema) authentication.getPrincipal();
24+
public String gerarToken(Authentication authentication, String issuer) {
25+
Object principal = authentication.getPrincipal();
26+
String subject = null;
27+
if(principal instanceof Sistema){
28+
Sistema sistema = (Sistema) principal;
29+
subject = sistema.getCodigo();
30+
}else if (principal instanceof Cliente){
31+
Cliente cliente = (Cliente) principal;
32+
subject = cliente.getCodigo();
33+
}
2234
Date hoje = new Date();
2335
Date dataExpiracao = new Date(hoje.getTime() + Long.parseLong(expiracao));
2436

2537
return Jwts.builder()
26-
.setIssuer("Api teste way")
27-
.setSubject(sistemaLogado.getCodigo())
38+
.setSubject(subject)
39+
.setIssuer(issuer)
2840
.setIssuedAt(hoje)
2941
.setExpiration(dataExpiracao)
3042
.signWith(SignatureAlgorithm.HS256, secret).compact();
3143
}
3244

33-
public boolean isTokenValido(String token){
45+
public boolean isTokenValido(String token) {
3446
try {
3547
Jwts.parser().setSigningKey(this.secret).parseClaimsJws(token);
36-
3748
return true;
38-
} catch (Exception e){
49+
} catch (Exception e) {
3950
return false;
4051
}
4152
}
4253

43-
public String getCodigo(String token){
54+
public String getCodigo(String token) {
4455
Claims claims = Jwts.parser().setSigningKey(this.secret).parseClaimsJws(token).getBody();
4556
return claims.getSubject();
4657
}

testeSantanderWay/src/main/java/br/com/testesantanderway/controller/AuthController.java

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,30 @@
1919
public class AuthController {
2020
@Autowired
2121
private AuthenticationManager authManager;
22+
2223
@Autowired
2324
private ServicoDeToken servicoDeToken;
2425

26+
@PostMapping("sistema/login")
27+
public ResponseEntity<TokenDTO> sistemaLogin(@RequestBody AuthForm form) {
28+
UsernamePasswordAuthenticationToken dadosLogin = form.ciarAutenticacaoSistema();
29+
try {
30+
Authentication authentication = authManager.authenticate(dadosLogin);
31+
String token = servicoDeToken.gerarToken(authentication, "SISTEMA");
32+
return ResponseEntity.ok(new TokenDTO(token, "Bearer"));
33+
} catch (AuthenticationException e) {
34+
return ResponseEntity.badRequest().build();
35+
}
36+
}
37+
2538
@PostMapping
26-
public ResponseEntity<TokenDTO> login(@RequestBody AuthForm form){
27-
UsernamePasswordAuthenticationToken dadosLogin = form.converter();
39+
public ResponseEntity<TokenDTO> login(@RequestBody AuthForm form) {
40+
UsernamePasswordAuthenticationToken dadosLogin = form.ciarAutenticacaoUsuario();
2841
try {
2942
Authentication authentication = authManager.authenticate(dadosLogin);
30-
String token = servicoDeToken.gerarToken(authentication);
43+
String token = servicoDeToken.gerarToken(authentication, "USUARIO");
3144
return ResponseEntity.ok(new TokenDTO(token, "Bearer"));
32-
} catch (AuthenticationException e){
45+
} catch (AuthenticationException e) {
3346
return ResponseEntity.badRequest().build();
3447
}
3548
}

testeSantanderWay/src/main/java/br/com/testesantanderway/controller/GastoController.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,15 +29,15 @@ public class GastoController {
2929
private GastoService gastoService;
3030

3131
//TODO permitir apenas USUARIO listar gastos
32-
@GetMapping
32+
@GetMapping("user/gasto")
3333
public ResponseEntity<List<GastoDTO>> listar(HttpServletRequest request) {
3434
String codigoUsuario = servicoDeToken.getCodigo(AutenticacaoViaTokenFilter.recuperarToken(request));
3535
List<Gasto> gastos = gastoService.listarGastosMaisRecentes(codigoUsuario);
3636
return ResponseEntity.ok(GastoDTO.converter(gastos));
3737
}
3838

3939
//TODO permitir apenas SISTEMA lançar gasto
40-
@PutMapping
40+
@PutMapping("sistema/gasto")
4141
public ResponseEntity lancar(HttpServletRequest request, @RequestBody GastoForm form) {
4242
Gasto gasto = form.converter(servicoDeToken.getCodigo(AutenticacaoViaTokenFilter.recuperarToken(request)));
4343
gastoService.lancar(gasto);
@@ -46,16 +46,16 @@ public ResponseEntity lancar(HttpServletRequest request, @RequestBody GastoForm
4646

4747
//TODO permitir apenas USUARIO listar gastos
4848
@Cacheable("gastoUsuario")
49-
@GetMapping("/{dataCriacao}")
49+
@GetMapping("user/gasto/{dataCriacao}")
5050
public Page<GastoDTO> filtro(HttpServletRequest request,
51-
@PathVariable LocalDate dataCriacao,
51+
@PathVariable String dataCriacao,
5252
@PageableDefault(sort = "dataCriacao", direction = Sort.Direction.DESC) Pageable paginacao) {
5353
String codigoUsuario = servicoDeToken.getCodigo(AutenticacaoViaTokenFilter.recuperarToken(request));
54-
return GastoDTO.converter(gastoService.encontrarGastosDoDia(codigoUsuario, dataCriacao, paginacao));
54+
return GastoDTO.converter(gastoService.encontrarGastosDoDia(codigoUsuario, LocalDate.parse(dataCriacao), paginacao));
5555
}
5656

5757
//TODO permitir apenas USUARIO categorizar gasto
58-
@PutMapping("categorizar")
58+
@PutMapping("user/gasto/categorizar")
5959
public ResponseEntity categorizar(@RequestBody Gasto gasto) {
6060
gastoService.categorizarGasto(gasto);
6161
return ResponseEntity.ok().build();

testeSantanderWay/src/main/java/br/com/testesantanderway/controller/form/AuthForm.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
44

5+
import java.util.Arrays;
6+
57
public class AuthForm {
68
private String email;
79
private String senha;
@@ -22,7 +24,11 @@ public void setSenha(String senha) {
2224
this.senha = senha;
2325
}
2426

25-
public UsernamePasswordAuthenticationToken converter() {
26-
return new UsernamePasswordAuthenticationToken(email, senha);
27+
public UsernamePasswordAuthenticationToken ciarAutenticacaoUsuario() {
28+
return new UsernamePasswordAuthenticationToken(email, senha, Arrays.asList(() -> "USUARIO"));
29+
}
30+
31+
public UsernamePasswordAuthenticationToken ciarAutenticacaoSistema() {
32+
return new UsernamePasswordAuthenticationToken(email, senha, Arrays.asList(() -> "SISTEMA"));
2733
}
2834
}

0 commit comments

Comments
 (0)