在我的应用程序中,我有以下架构
users (id(PK), username, email(unique), password, etc)
devices (id(PK), device_id, status, user_id)
关系
user HAS ONE device
应用程序需要支持两种版本的基本身份验证。
我基本上跟随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响应。