Symfony2一起使用http-basic和preauthentication

时间:2015-05-19 15:59:59

标签: security symfony basic-authentication api-key

我需要什么

在我的应用程序中,我有以下架构

users (id(PK), username, email(unique), password, etc)
devices (id(PK), device_id, status, user_id)

关系

user HAS ONE device

应用程序需要支持两种版本的基本身份验证。

  • 变体:正常,电子邮件作为用户名和密码。管理控制台将使用此方法。管理控制台就像一个webapp。
  • 变体二:电子邮件为用户名,设备ID为密码。移动应用程序将使用此方法。在从设备进行身份验证过程中,它会将设备ID作为密码传递。由于用户一次只能拥有设备,因此身份验证过程将匹配设备ID和电子邮件以识别用户。

我尝试了什么?

我基本上跟随symfony tutorial on api key based authentication进行第二次变体,http-basic进行第一次变异。请在下面找到我的security.xml。

在这里,我需要在任何底层身份验证机制通过时传递防火墙设置。例如,在Web身份验证的情况下,只有http-basic会通过,如果设备登录,只会传递simple-preauth。

security.xml文件

<srv:container xmlns="... ...">

  <config>
    <firewall name="resource" pattern="^/" stateless="true">
        <http-basic realm="Webservice" />
        <simple-preauth authenticator="device_authenticator" />
    </firewall>

    <provider name="administrators">
      <entity class="AppBundle\Entity\User" property="email"/>
    </provider>
    <provider name="device_id_user_provider" id="device_id_user_provider" />

    <encoder class="AppBundle\Entity\User" algorithm="bcrypt" cost="12"/>

  </config>
</srv:container>

的services.xml

<container xmlns="... ...">

   <services>
       <service id="device_id_user_provider"
                class="AppBundle\Security\DeviceIdUserProvider">
           <argument type="service" id="doctrine.orm.entity_manager" />
       </service>
       <service id="device_authenticator" class="AppBundle\Security\DeviceAuthenticator">
            <argument type="service" id="device_id_user_provider" />
       </service>
   </services>
</container>

我的问题

对于每个请求,防火墙都会尝试通过这两种身份验证机制。因此它始终以401响应。

  • 我是否以错误的方式设置了它?
  • 或防火墙必须通过其所有基础身份验证机制?
  • 或者这只是因为使用预身份验证而发生的?
  • 任何推荐的方法来实现这一目标?

0 个答案:

没有答案