That mostly depends on your web server software. If PHP, you can use readfile().
See the example here. Store the .swf itself above the webroot, then use some authentication before calling readfile. In this setup, you'd call the php file with your readfile() call in place of the .swf.
So it might look, in an extremely simplified way, something like this:
fakeswf.php:
if (authenticate()) {
header("Content-Type: application/flash");
readfile("../realswf.swf");
}
else {
header("Content-Type: text/html");
echo "Nothing to see here.";
}
index.html:
<a href="fakeswf.php">Click here to play my game</a>
As far as the browser is concerned (if you properly set the headers as per the example), fakeswf.php is a .swf file.
IMPORTANT NOTE: I didn't actually look up the proper content type for a .swf file. Be sure to look it up and change it accordingly.