Symfony Private Beta Login

Търся да настроя частна бета версия на сайт на symfony, който стартирам скоро. Имам списък с имейл адреси на поканени хора, за да проверя в текстов файл на сървъра, и бих искал да представя на хората html формуляр всеки път, когато се опитат да влязат в сайта без разрешение. След като човек въведе своя имейл адрес, той трябва да го пренасочи към началната страница. Сложната част е, че в миналото използвам FOSUserBundle с вече въведена система за влизане в цял акаунт. Как да подходя към този проблем? Човекът, който влиза с имейла си, все още няма акаунт, така че не мога просто да добавя роля като INVITED_USER към неговия потребителски документ, така че обмислям да опитам да съхраня състоянието му в неговата сесия и да проверя това с изразът allow_if на symfony 2.4, но получавам грешка:

Фатална грешка: Неуловено изключение „Symfony\Component\Config\Definition\Exception\InvalidConfigurationException“ със съобщение „Неразпознати опции „allow_if“ под „security.access_control.17““ в C:\wamp\www\vendor\symfony\symfony\src \Symfony\Component\Config\Definition\ArrayNode.php на ред 306

Моят файл security.yml изглежда така:

security:
    encoders:
        FOS\UserBundle\Model\UserInterface: sha512

    role_hierarchy:
        ROLE_ADMIN:       ROLE_USER
        ROLE_SUPER_ADMIN: ROLE_ADMIN

    providers:
        fos_userbundle:
            id: fos_user.user_provider.username_email

    firewalls:
        beta:
            pattern: ^/
            anonymous: ~
            form_login:
                login_path: /beta
                check_path: /beta_invite_check
                always_use_default_target_path: true
                default_target_path: /
            logout:
                path: /logout
                target: /
        main:
            pattern:  ^/
            form_login:
                check_path: /login_check
                provider: fos_userbundle
                always_use_default_target_path: false
                default_target_path: /profile
                use_referer: true
                success_handler: security.authentication.handler

            logout:
                path:   /logout
                target: /
                invalidate_session: false
            anonymous: ~

        login:
            pattern: ^/login$
            security: false

    access_control:
        - { path: ^/beta, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/login$, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/register, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/resetting, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/account, roles: ROLE_USER}
        - { path: /_wdt/.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: /_profiler/.*, role: IS_AUTHENTICATED_ANONYMOUSLY }
        - { path: ^/profile, role: ROLE_USER }
        - { path: ^/submit, role: ROLE_USER }
        - { path: ^/submissions, role: ROLE_USER }
        - { path: ^/uploadCredits, role: ROLE_USER }
        - { path: ^/transactions, role: ROLE_USER }
        - { path: ^/activity, role: ROLE_USER }
        - { path: ^/browse/join, role: ROLE_USER }
        - { path: ^/browse/follow, role: ROLE_USER }
        - { path: ^/browse/unfollow, role: ROLE_USER }
        - { path: ^/player/rating, role: ROLE_USER }
        - { path: ^/, allow_if: "'BETA_ALLOWED' == request.getSession().beta" }

Някой знае ли защо се случва това? allow_if изглежда е нова функция, така че може би нечий пакет не се справя добре с нея? Ето и моя файл composer.json, за всеки случай:

{
    "name": "symfony/framework-standard-edition",
    "description": "The \"Symfony Standard Edition\" distribution",
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require": {
        "doctrine/mongodb-odm": "1.0.*@dev",
        "doctrine/mongodb-odm-bundle": "3.0.*@dev",
        "php": ">=5.3.3",
        "symfony/symfony": "2.4.1",
        "doctrine/orm": "~2.2,>=2.2.3",
        "doctrine/doctrine-bundle": "1.2.*",
        "twig/extensions": "1.0.*",
        "symfony/assetic-bundle": "2.1.*",
        "hipaway-travel/mandrill-bundle": "dev-master",
        "symfony/monolog-bundle": "2.2.*",
        "sensio/distribution-bundle": "2.2.*",
        "sensio/framework-extra-bundle": "2.2.*",
        "sensio/generator-bundle": "2.2.*",
        "jms/security-extra-bundle": "dev-master",
        "friendsofsymfony/user-bundle": "~2.0.*@dev",
        "jms/di-extra-bundle": "dev-master",
        "sonata-project/media-bundle": "2.2.*@dev",
        "sonata-project/admin-bundle": "2.2.*@dev",
        "sonata-project/core-bundle": "2.2.*@dev",
        "sonata-project/doctrine-mongodb-admin-bundle": "2.2.*@dev",
        "avalanche123/imagine-bundle": "v2.1",
        "braintree/braintree_php" : "dev-master",
        "cometcult/braintree-bundle": "dev-master",
        "paypal/rest-api-sdk-php": "dev-master",
        "kmj/paypalbridgebundle": "dev-master",
        "hwi/oauth-bundle": "0.3.*@dev",
        "cboden/Ratchet": "0.3.0",
        "react/zmq": "0.2.*"

    },
    "scripts": {
        "post-install-cmd": [
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
        ],
        "post-update-cmd": [
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::buildBootstrap",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::clearCache",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installAssets",
            "Sensio\\Bundle\\DistributionBundle\\Composer\\ScriptHandler::installRequirementsFile"
        ]
    },
    "config": {
        "bin-dir": "bin"
    },
    "minimum-stability": "dev",
    "extra": {
        "symfony-app-dir": "app",
        "symfony-web-dir": "web"
    }
}

Благодаря предварително!


person patrogizmo    schedule 16.01.2014    source източник


Отговори (1)


Начинът, по който съм прилагал това преди, е да използвам обект Invitation.

  1. Генерирайте код за покана и изпратете имейл на потребителя с връзка към формата за регистрация
  2. Приемайте само регистрации, които включват валиден код за покана

Ще трябва да разширите регистрационния формуляр с новото поле за покана и действието на контролера за регистрация.

По принцип прочетете това: https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/adding_invitation_registration.md

:)

TLDR; Не се притеснявайте за първото влизане и вместо това използвайте система за покани.

person Leevi Graham    schedule 17.01.2014
comment
Това е подходът, който обикновено използвам, но както казах във въпроса, не искам да създавам потребител, когато се въведе бета код; Искам само да дам на клиента достъп до сайта (където след това могат да се регистрират, ако искат). Опитах се да направя това, използвайки сесията на клиента и проверявайки с помощта на опцията allow_if, но по някаква причина извежда грешка. Имате ли някаква идея защо или начин да използвате allow_if, който ще постигне същия резултат? - person patrogizmo; 18.01.2014
comment
В такъв случай защо просто не използвате основно http удостоверяване на сървъра. Връзка към документи на Apache: http://httpd.apache.org/docs/2.4/howto/auth.html - person Leevi Graham; 20.01.2014