【问题标题】:Symfony Security AuthenticationSymfony 安全认证
【发布时间】:2015-07-28 08:20:44
【问题描述】:

为什么在我的调试面板中看到“您未通过身份验证”。这个我有printscreen 我想要这个printscreen 我使用symfony_book,如果我有家,一切正常,但是:

在我的变体中,用户在 ANOTHER SITE 和我的网站中进行身份验证,我有 GET 方法的用户数据 - 电子邮件、密钥和参考

 http://aog.local/app_dev.php/auth/enko@gmail.com/962cc9a06924034d1285e8d75b2faf‌​2d/00223311121

这个我怎么能做认证,我怎么认证才能出现全局变量用户printscreen ????

我创建身份验证服务位此服务未进行身份验证

我使用 Symfony 2.6 并拥有实体 Developer 和 User 扩展 SUser -> SUser 实现 UserInterface thgis 是用于身份验证的路由:

#Enter routing
artel_profile_auth:
path:     /auth/{email}/{secretKey}/{referenceId}
defaults: { _controller: ArtelProfileBundle:DeveloperProfile:auth }

login_route:
path:     /login
defaults: { _controller: ArtelProfileBundle:Security:login }

login_check:
path: /login_check
defaults: { _controller: ArtelProfileBundle:Security:securityCheck }

index:
pattern:   /
defaults:  { _controller: ArtelProfileBundle:Security:index }

和行动:

    public function authAction($email, $secretKey, $referenceId)
{
    $authenticator = $this->get('artel.profile.authenticator');
    try {
        $authDeveloper = $authenticator->auth($email, $secretKey, $referenceId);

        return $this->redirect($this->generateUrl('artel_profile_homepage', array('username' => $authDeveloper->getUsername())) .'#personal-information');
    } catch (\Exception $error) {

        return new Response($error->getCode() . ': '.$error->getMessage());
    }
}

和 artel.profile.authenticator:

<?php
 namespace Artel\ProfileBundle\Helper;

 class Authenticator
{
const SESSION_NAME = 'developer_auth';

private $session;
private $secretAppKey;
private $developerRepository;
private $codeuserreferenceRepository;

public function __construct($session, $secretAppKey, $developerRepository, $codeuserreferenceRepository)
{
    $this->session = $session;
    $this->secretAppKey = $secretAppKey;
    $this->developerRepository = $developerRepository;
    $this->codeuserreferenceRepository = $codeuserreferenceRepository;
}

public function auth($email, $secretKey, $referenceId)
{
    $this->validateSecretAppKey($secretKey, $referenceId);
//todo: We need to match $referenceId with email in validateDeveloper
    $developer = $this->validateDeveloper($referenceId);
    $this->setSession($developer);

    return $developer;
}

public function authAdmin($email, $secretKey, $referenceId)
{
    $this->validateSecretAppKey($secretKey, $referenceId);
    //todo: We need to match $referenceId with email in validateDeveloper
    $developer = $this->validateAdminDeveloper($referenceId);
    $this->setSession($developer);

    return $developer;
}

public function check($developer)
{
    $result = false;

    $session = $this->session->get(self::SESSION_NAME);
    if ($session && $session == $developer->getId()) {
        $result = true;
    }

    return $result;
}

public function logout()
{
    $this->session->remove(self::SESSION_NAME);
}

protected function validateDeveloper($referenceId)
{
    $code_user_reference = $this->codeuserreferenceRepository->findOneByCodereference($referenceId);
    $id = $code_user_reference->getDeveloper()->getId();

    $developer = $this->developerRepository->findOneById($id);


    if (! $developer) {
        $this->exception('developer not found', 100);
    }

    return $developer;
}

protected function validateAdminDeveloper($referenceId)
{
    $code_user_reference = $this->codeuserreferenceRepository->findOneByCodereference($referenceId);

    $id = $code_user_reference->getDeveloper()->getId();

    $developer = $this->developerRepository->findOneById($id);
    $role = $developer->getRole();


    if ($role != 'ROLE_ADMIN') {
        $this->exception('developer not Admin', 100);
    }

    return $developer;
}

protected function validateSecretAppKey($secretKey, $referenceId)
{
    if ($secretKey != md5($referenceId.$this->secretAppKey)) {
        $this->exception('secret ket is not valid', 101);
    }
}

protected function setSession($developer)
{
    $this->session->set(self::SESSION_NAME, $developer->getId());
}

protected function exception($message, $code)
{
    throw new \Exception($message, $code);
}
}

但在调试面板中:“您未通过身份验证。” 这是我的安全,也许是问题?|

security:
 encoders:
    Artel\ProfileBundle\Entity\Users:
        algorithm:        sha1
        encode_as_base64: false
        iterations:       1
    Artel\ProfileBundle\Entity\Developers:
        algorithm:        sha1
        encode_as_base64: false
        iterations:       1
    Symfony\Component\Security\Core\User\User: plaintext

role_hierarchy:
    ROLE_CLIENT:   ROLE_USER
    ROLE_COMPANY:  ROLE_USER
    ROLE_FREELANCER: ROLE_USER
    ROLE_ADMIN:    [ROLE_MODERATOR, ROLE_CLIENT, ROLE_COMPANY, ROLE_FREELANCER]
    ROLE_SUPER_ADMIN: [ROLE_USER, ROLE_MODERATOR, ROLE_ADMIN, ROLE_ALLOWED_TO_SWITCH]

providers:
    chain_provider:
        chain:
            providers: [user_db, user_dev, in_memory]
            providers: [user_dev, in_memory]
    user_db:
        entity: { class: Artel\ProfileBundle\Entity\Users, property: email }
    user_dev:
        entity: { class: Artel\ProfileBundle\Entity\Developer, property: email }
    in_memory:
       memory:
         users:
            admin_tyty: { password: adminpass_tyty, roles: [ 'ROLE_ADMIN' ] }


firewalls:
    default:
        anonymous: ~
        http_basic: ~
        form_login:
            login_path: /login
            check_path: /login_check
    access_control:
    - { path: ^/login, roles: IS_AUTHENTICATED_ANONYMOUSLY }
    - { path: ^/, roles: ROLE_ADMIN }

在我的变体中,用户在 ANOTHER SITE 和我的网站中进行身份验证,我有 GET 方法的用户数据 - 电子邮件、密钥和参考

 http://aog.local/app_dev.php/auth/enko@gmail.com/962cc9a06924034d1285e8d75b2faf‌​2d/00223311121

【问题讨论】:

    标签: php security symfony authentication


    【解决方案1】:

    您应该通过自己的登录表单实现身份验证,这样用户才能真正进行身份验证:http://symfony.com/doc/current/cookbook/security/form_login_setup.html

    如果你的表单有正确的路由,Symfony 会处理剩下的。

    【讨论】:

    • 在我的变体中,用户在另一个站点和我的站点中进行身份验证我有 GET 方法的用户数据,http://aog.local/app_dev.php/auth/enko@gmail.com/962cc9a06924034d1285e8d75b2faf2d/00223311121 我创建身份验证服务位此服务未进行身份验证
    • 喜欢我的项目工作中的食谱和主页。但我有来自另一个网站的 GET url。我更新了我的问题
    • 如果你有一个无状态的应用程序,那么你将无法在那里验证你的用户,所以你应该找到像 oAuth 这样的方法来进行一些验证,以归档你发布的第二个打印屏幕你的问题。
    猜你喜欢
    • 1970-01-01
    • 2011-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 2015-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多