symfony2 / php:仅限特定用户的网址

时间:2013-08-25 19:45:02

标签: php security symfony

据我所知,Symfony2能够在内存中配置用户:

 providers:
    in_memory:
        memory:
            users:
                user1:  { password: pwd1, roles: [ 'ROLE_USER' ] }
                user2:  { password: pwd2, roles: [ 'ROLE_USER' ] }
                user3:  { password: pwd3, roles: [ 'ROLE_USER' ] }
                admin: { password: adminpass, roles: [ 'ROLE_ADMIN' ] }

我正在构建小型网站,只有经过身份验证的用户才能访问照片库。一个图库将匹配此路线:http://mysite/clients/client-name

从Symfony文档中我可以看到我们可以将路由限制为特定角色。但这不是我想要的,因为我的所有用户(客户端)都将扮演角色ROLE_USER。我想要的是限制每个/clients /客户名称route to a specific user. So for instance user1 would have access to / clients / john-smyth`

我该怎么做?

使用access_control参数,如何替换用户的角色?

access_control:
    - { path: ^/clients/john-smyth, roles: ROLE_USER }

1 个答案:

答案 0 :(得分:1)

您可以根据用户名编写一个与某个路径或路径匹配的Voter

这是一个非常基本的例子(我在没有测试的情况下一起攻击,所以可能需要一些调试)才能让你前进:

class GalleryAccessVoter implements VoterInterface
{
    ...

    public function vote(TokenInterface $token, $object, array $attributes)
    {
        $request = $this->container->get('request');
        $route = $request->get('_route');
        $user = $token->getUser();

        if ($route == 'acme_gallery_show' && null !== $user) {
            $galleryId = $request->request->get('id');
            if ($galleryId == $user->getUsername()) {
                return VoterInterface::ACCESS_GRANTED;
            }
        }

        return VoterInterface::ACCESS_DENIED;
    }