获取匿名用户的用户实例

时间:2018-10-21 22:50:35

标签: symfony symfony4 symfony-security

我的symfony项目设置得很整齐,但是我一直在努力解决这一问题。

我有一个App/Entity/User类,用于填充数据库中的用户信息

class User implements AdvancedUserInterface, \Serializable
{
    public function __construct()
    {
        $this->forumPermission = new ArrayCollection();
        $this->activities = new ArrayCollection();
    }

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;
    /**
     * @ORM\Column(
     *     type="string",
     *     name="salt",
     *     length=32
     * )
     */
    private $salt = "";
    /**
     * @ORM\Column(
     *     type="string",
     *     length=75,
     *     name="user_name"
     * )
     * @Assert\NotBlank(
     *     message="De gebruikersnaam moet ingevuld zijn"
     * )
     */
    private $username;
    // ...
}

并在security.yaml中正确链接

security:
    # https://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers
    providers:
        db_provider:
            entity:
                class: App\Entity\User
                property: username

但是,如果用户未登录,则将其视为匿名用户。 我发现方便的是,匿名用户将拥有其自己的User实例,而使用$this->getUser() === null。 我知道为什么,但是我很固执:

我有一个基本控制器,该控制器是从所有其他控制器继承的:

abstract class BaseController extends Controller
{
    protected $logger = null;
    protected $globals = null;
    protected $translator = null;
    protected $security = null;
    /* @var $currentUser User */
    protected $currentUser = null;

    public function __construct(
        Globals $globals,
        LoggerInterface $logger,
        TranslatorInterface $translator,
        Security $security
    ) {
        $this->logger = $logger;
        $this->globals = $globals;
        $this->translator = $translator;
        $this->currentUser = $security->getUser();
    }

    protected function getUser() {
        if (!$this->currentUser instanceof User) {
            /* @var $anonForumPerm ForumPermission */
            $anonForumPerm = $this->getDoctrine()->getRepository(ForumPermission::class)->find(5);
            $this->currentUser = new User();
            $this->currentUser->setName('Anonymous')
                ->setSurname('User')
                ->setUsername('anon.')
                ->setForumPermission($anonForumPerm)
            ;
        }
        return $this->currentUser;
    }
    // ...
}

这似乎可行,但是我现在唯一的问题是树枝的app.user,它仍然为空。

有没有办法将$this->currentUser推到树枝上的app.user? 还是有更好的方式来处理匿名用户?

我的理论是,无论用户是否尚未登录,我都希望能够在app.userIS_AUTHENTICATED_FULLY之间进行选择。

一些额外的输入将不胜感激

1 个答案:

答案 0 :(得分:0)

我之前也曾为这个问题而苦苦挣扎,这是我的经验中的一些补充意见。

如果您的网站访问者未登录,Symfony会给他AnonymousToken,可通过{{ app.token.user }}在树枝中获取该anon.,它返回字符串{{ app.user }}

另一种方法是只检查null是否不是<android.support.v4.widget.NestedScrollView android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:layout_width="match_parent" android:layout_height="wrap_content" android:clipToPadding="false" /> </android.support.v4.widget.NestedScrollView>