Looking at it we should also pass `obj` to this method and cache its results, just like we do with `get_group_permissions`:

```python
def get_user_permissions(self, user_obj, obj=None):
    """
    Returns a set of permission strings tied to user_obj.
    """
    if user_obj.is_anonymous() or obj is not None:
        return set()
    if not hasattr(user_obj, '_user_perm_cache'):
        if user_obj.is_superuser:
            perms = Permission.objects.all()
        else:
            perms = usr_obj.user_permissions.all()
        perms = perms.values_list('content_type__app_label', 'codename').order_by()
        user_obj._user_perm_cache = set("%s.%s" % (ct, name) for ct, name in perms)
    return user_obj._user_perm_cache
```