Skip to content

Mejora: eliminar duplicación del chequeo de autenticación con un Decorator #122

Description

@gabordonp

Hola @jzyong
Encontramos que el chequeo "Config.SERVER_AUTH.equals(auth)" está duplicado en al menos 7 handlers HTTP administrativos (ExitServerHandler, GmHandler, ReloadConfigHandler, ReloadScriptHandler, JvmInfoHandler, ThreadInfoHandler, SetServerStateHandler).
Situación actual:
Cada handler repite el mismo bloque de validación; si se agrega un nuevo endpoint administrativo y se olvida copiar el chequeo, queda expuesto sin autenticación (ExitServerHandler incluso puede apagar el servidor).
Solución propuesta:
Aplicar el patrón Decorator con una clase AuthenticatedHandlerDecorator que implemente IHandler y centralice la verificación, delegando al handler real solo si la autenticación es válida.
Esto reduce la duplicación y hace que la protección de nuevos endpoints administrativos sea explícita en su registro, no opcional. Quedamos atentos a sus comentarios.

  1. Implementación del Decorador: AuthenticatedHandlerDecorator

public class AuthenticatedHandlerDecorator implements IHandler {

private final IHandler delegate;

public AuthenticatedHandlerDecorator(IHandler delegate) {
    this.delegate = delegate;
}

@Override
public void run() {
    String auth = delegate.getParam("auth");
    // Centraliza la verificación de autenticación
    if (!Config.SERVER_AUTH.equals(auth)) {
        delegate.sendMsg("验证失败"); // Mensaje de fallo
        return;
    }
    delegate.run(); // Delega el comportamiento original si está autenticado
}

}
2. Clase concreta: ExitServerHandler

@HandlerEntity(path = "/server/exit")
public class ExitServerHandler extends HttpHandler {

private static final Logger LOGGER = LoggerFactory.getLogger(ExitServerHandler.class);

@Override
public void run() {
    String info = String.format("%s关闭服务器", MsgUtil.getIp(getSession()));
    LOGGER.info(info);
    sendMsg(info);
    
    MailConfig mailConfig = MailManager.getInstance().getMailConfig();
    String[] recives = mailConfig.getReciveUser().toArray(new String[mailConfig.getReciveUser().size()]);
    MailManager.getInstance().sendTextMail("服务器关闭", Config.SERVER_NAME + info, recives);
    
    System.exit(1);
}

}

Image

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions