## Is your feature request related to a problem?

It's possible to brute-force passwords if you're particularly determined

## Describe the solution you'd like

Install `django-axes`: https://django-axes.readthedocs.io/en/latest/2_installation.html


## Describe alternatives you've considered



## Additional context



#### *Thank you* for your feature request – we love each and every one!

posthog/api/test/test_dashboard.py
self.client.logout()
        dashboard = Dashboard.objects.create(team=self.team, share_token="testtoken", name="public dashboard")
        test_no_token = self.client.get(f"/api/dashboard/{dashboard.pk}/")
        self.assertEqual(test_no_token.status_code, 403)
        response = self.client.get(f"/api/dashboard/{dashboard.pk}/?share_token=testtoken")
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json()["name"], "public dashboard")
    def test_shared_dashboard(self):
        self.client.logout()
        dashboard = Dashboard.objects.create(
            team=self.team, share_token="testtoken", name="public dashboard", is_shared=True,
        )
        response = self.client.get("/shared_dashboard/testtoken")
        self.assertEqual(response.status_code, 200)
    def test_share_dashboard(self):
        dashboard = Dashboard.objects.create(team=self.team, name="dashboard")
        response = self.client.patch(
            "/api/dashboard/%s/" % dashboard.pk,
            {"name": "dashboard 2", "is_shared": True},
            content_type="application/json",
        )
        dashboard = Dashboard.objects.get(pk=dashboard.pk)
        self.assertIsNotNone(dashboard.share_token)
    def test_return_cached_results(self):