diff --git a/extensions/tags/src/Access/DiscussionPolicy.php b/extensions/tags/src/Access/DiscussionPolicy.php
index 423286f1a..199cf77a6 100755
--- a/extensions/tags/src/Access/DiscussionPolicy.php
+++ b/extensions/tags/src/Access/DiscussionPolicy.php
@@ -57,13 +57,30 @@ class DiscussionPolicy extends AbstractPolicy
      * @param Discussion $discussion
      * @return bool
      */
-    public function after(User $actor, $ability, Discussion $discussion)
+    public function before(User $actor, $ability, Discussion $discussion)
     {
         // Wrap all discussion permission checks with some logic pertaining to
-        // the discussion's tags. If the discussion has any tags that are
-        // restricted, then the user *must* have permission for all of them.
-        foreach ($discussion->tags as $tag) {
-            if ($tag->is_restricted && ! $actor->hasPermission('tag' . $tag->id . '.discussion.' . $ability)) {
+        // the discussion's tags. If the discussion has a tag that has been
+        // restricted, and the user has this permission for that tag, then they
+        // are allowed. If the discussion only has tags that have been
+        // restricted, then the user *must* have permission for at least one of
+        // them.
+        $tags = $discussion->tags;
+
+        if (count($tags)) {
+            $restricted = true;
+
+            foreach ($tags as $tag) {
+                if ($tag->is_restricted) {
+                    if ($actor->hasPermission('tag'.$tag->id.'.discussion.'.$ability)) {
+                        return true;
+                    }
+                } else {
+                    $restricted = false;
+                }
+            }
+
+            if ($restricted) {
                 return false;
             }
         }