Esta plataforma de educação em segurança emprega arquitetura B/S com o framework SSM (Spring, SpringMVC, MyBatis) e banco de dados MySQL. O sistema oferece funcionalidades para administradores e usuários:
Administradores
- Gerenciamento de usuários e perfil
- Controle de cursos de segurança e categorias
- Administração de loja virtual e pedidos
- Criação de exames e questões
Usuários
- Acesso a cursos de segurança
- Realização de exames e histórico de tentativas
- Gerenciamento de pedidos e endereços
- Acúmulo de pontos em loja virtual
Especificações Técnicas
- Linguagem principal: Java
- Frontend: Vue.js/HTML
- Persistência: MyBatis
- Servidor: Tomcat 7-10
- Banco de dados: MySQL 5.7+
- Gerenciamento de dependências: Maven
Implementação de Código
Interceptor para CORS e Auetnticação
package com.secure.interceptor;
import java.io.PrintWriter;
import javax.servlet.http.*;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import com.secure.annotation.IgnoreAuth;
import com.secure.model.AccessToken;
import com.secure.service.TokenService;
@Component
public class AuthInterceptor implements HandlerInterceptor {
private static final String TOKEN_HEADER = "Authorization";
@Autowired
private TokenService tokenService;
@Override
public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
res.setHeader("Access-Control-Allow-Origin", req.getHeader("Origin"));
res.setHeader("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
res.setHeader("Access-Control-Allow-Headers", "Content-Type, Authorization");
if(handler instanceof HandlerMethod) {
IgnoreAuth ann = ((HandlerMethod) handler).getMethodAnnotation(IgnoreAuth.class);
if(ann != null) return true;
}
String authToken = req.getHeader(TOKEN_HEADER);
if(authToken != null) {
AccessToken token = tokenService.validarToken(authToken);
if(token != null) {
req.getSession().setAttribute("userID", token.getUserId());
return true;
}
}
res.setContentType("application/json");
PrintWriter out = res.getWriter();
out.print("{\"status\":401, \"message\":\"Credenciais inválidas\"}");
return false;
}
}
Controlador de Autenticação
package com.secure.controller;
import org.springframework.web.bind.annotation.*;
import com.secure.model.Usuario;
import com.secure.service.UsuarioService;
@RestController
@RequestMapping("/api/usuarios")
public class AuthController {
@Autowired
private UsuarioService usuarioService;
@PostMapping("/autenticar")
public Resposta autenticar(@RequestParam String login,
@RequestParam String senha) {
Usuario user = usuarioService.buscarPorCredenciais(login, senha);
if(user == null) {
return Resposta.erro("Credenciais inválidas");
}
String token = TokenService.gerarToken(user.getId());
return Resposta.sucesso().adicionar("token", token);
}
@PostMapping("/registrar")
public Resposta registrar(@RequestBody Usuario novoUsuario) {
if(usuarioService.existeUsuario(novoUsuario.getLogin())) {
return Resposta.erro("Usuário já existe");
}
usuarioService.registrar(novoUsuario);
return Resposta.sucesso();
}
@PostMapping("/recuperar-senha")
public Resposta recuperarSenha(@RequestParam String login) {
usuarioService.redefinirSenha(login, "senhaTemporaria");
return Resposta.sucesso("Senha redefinida");
}
}
class Resposta {
private int codigo;
private String mensagem;
public static Resposta sucesso() {
return new Resposta(200, "Sucesso");
}
// Métodos auxiliares omitidos para brevidade
}