Ouch. That is indeed a rather inflexible design. I for one wouldn't care too much about the design when I'm admin, since for me it would be more important to actually see the pages when I'm logged in, so that I can verify the contents. But to each his own I guess :)
Additionally, you could check the return value of:
Director::get_site_mode();
If in the CMS, you should get 'cms' as return value, 'site' otherwise.
Example code:
class AnonPage extends Page {
public function canView($member = null) {
if(Director::get_site_mode() == 'cms'){
return parent::canView($member);
}
if(!$member || !(is_a($member, 'Member')) || is_numeric($member))
$member = Member::currentUser();
return $member ? false : true;
}
function can($type) {
return $type == 'view' ? $this->canView() : parent::can($type);
}
}