Bridge mode#
A proxy can see connections, chat and commands. It cannot see a player walking, breaking a block or opening a chest โ that happens on the game server. Bridge mode is how the two halves cover for each other.
The idea#
Put the same jar on your backend servers. It detects the proxy, drops everything it does not need โ no accounts, no database, no license โ and does exactly one thing:
Hold every player still until the proxy says they are authenticated.
Turning it on#
Nothing to turn on. A Paper server with proxy forwarding enabled becomes a bridge by itself:
config/paper-global.ymlโproxies.velocity.enabled: true, orspigot.ymlโsettings.bungeecord: true
The console says so at startup:
[slimelogin] Running in BRIDGE mode: this server is behind a proxy, so Slime Login on the
proxy handles the accounts and this side only holds players until it says they
are authenticated.
Force it either way with mode: bridge or mode: standalone in config.yml.
How the two sides talk#
Over Minecraft's built-in plugin messaging channel slimelogin:auth, which already exists between
a proxy and its backends. No ports, no database credentials, no network configuration.
Player Proxy Backend (bridge)
โ โ โ
โโโ connect โโโโโโโโโบโ โ
โ โโโ send to lobby โโโโโโโโโโโโโโโบโ
โ โ โโ lock (always)
โ โโโโโโ QUERY "is X authenticated?"
โ โโโโโ STATE false โโโโโโโโโโโโโโโบโ
โ โ โ frozen
โโโ /register โโโโโโโบโ โ
โ โโ account created โ
โ โโโโโ STATE true โโโโโโโโโโโโโโโโบโ
โ โ โโ unlock
โโโโโ free to play โโโดโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
Two messages, and each side asks as well as listens:
| Direction | Meaning | |
|---|---|---|
QUERY |
backend โ proxy | "I have this player, what is their state?" |
STATE |
proxy โ backend | "authenticated" / "not authenticated" |
The backend asks on join (and again a second later); the proxy also pushes the state the moment a player authenticates and on every server switch. Neither side depends on the other's timing.
Locked by default
A player starts locked and is only ever unlocked by a message from the proxy. If a message is lost, or the proxy plugin is missing entirely, the player stays frozen. Failure can only make it stricter, never more permissive.
What gets blocked#
The full set from the standalone plugin, all individually toggleable:
movement ยท chat ยท commands ยท inventory (click, drag, open, drop) ยท block break ยท block place ยท interactions with blocks and entities ยท damage in both directions ยท teleport ยท item pickup ยท vehicles
protection:
block-movement: true
block-chat: true
block-commands: true
block-inventory: true
block-interact: true
block-break: true
block-place: true
block-damage: true
block-teleport: true
block-pickup: true
hide-unlogged: false
allowed-commands: []
/login and /register are registered on the proxy, so they are intercepted before they ever
reach the backend โ the player can always run them.
Securing the backend#
Bridge mode trusts the proxy. That trust only holds while players cannot reach the backend directly.
Two things protect it:
-
The proxy filters forged messages. A modified client can send data on any channel. The proxy drops anything arriving on
slimelogin:authfrom a player, so nobody can tell a backend "I am authenticated" themselves. You will see this in the proxy log if someone tries: -
Forwarding stops direct connections. Without it, someone who knows the backend's address connects straight to it and never passes through the proxy.
If the plugin cannot confirm a forwarding secret is in use, it says so, loudly:
[Bridge] This server accepts proxy logins WITHOUT a forwarding secret.
[Bridge] Anyone who can reach its port directly bypasses the login system.
On Velocity, fix it with player-info-forwarding-mode = "modern" in velocity.toml plus
proxies.velocity.enabled: true and the same secret in config/paper-global.yml.
On BungeeCord there is no shared secret at all โ ip_forward: true only passes the player's
address along, it does not prove where the connection came from. A firewall that lets nothing but
the proxy reach the backend ports is the only real protection there, so the warning stays on until
you add one. A BungeeGuard-style plugin does the same job if a firewall is not an option.
Which servers are unprotected#
The proxy notices a backend that never announces itself and names it, once, the first time a player lands there:
Server 'survival' has no Slime Login on it, so players there can move and break blocks
before logging in. Put this same jar in that server's plugins folder - it detects the
proxy and switches to bridge mode on its own.
Nothing is printed for servers that are already covered, so a quiet console means every server a player has visited is protected.
Bridge vs auth server#
Both solve the same problem. They can be combined.
| Bridge | Auth server | |
|---|---|---|
| Extra server needed | No | Yes (limbo or a small Paper world) |
| Extra RAM | None | One more process |
| Player is | Frozen where they landed | Held in an empty world |
| Configuration | None | Server names in config |
| Works on non-Paper backends | No | Yes |