在过去的两天里,我在Symfony2中阅读了有关身份验证的多个资源。我想我理解大部分内容,但我觉得我不了解整件事。我成功创建了两个身份验证提供程序和一个UserProvider,但我不了解如何自定义登录过程。
我尝试做的是编写一个REST API,它将由我也写的客户端使用。客户端将显示一个表单并通过Ajax发送凭据。因此,我不想使用HTTP基本身份验证(我不希望弹出浏览器窗口),我不想使用OAuth或任何令牌(但使用凭据)和我不想使用form_login(登录表单由Angular呈现)。
使用我的自定义身份验证提供程序,我可以使用我在登录控制器中设置的cookie来验证客户端是否已登录。但是,如果我尝试使用session / Symfony安全捆绑包,我不会理解如何登录(或在Symfony中登录的内容)。我可以避免来自Symfony的所有安全问题并推出我自己的实现,但我更愿意了解Symfony如何期望身份验证提供程序和登录控制器一起工作。
我想要的是一条路由,客户可以检查它是否已登录,登录和注销。
GET /session # return the session if it exists, or 401
POST /session { session: { email: testy@mctest, password: test1234 }} # login
DELETE /session # destroy session
我如何在一个" Symfony"办法? (用于解释在身份验证提供程序之外的Symfony中的一般身份验证概念的加分点)
答案 0 :(得分:1)
我会尝试根据我个人的了解,使其更加冗长和简单: - )。
这是我从基于Symfony Security组件实现自己的安全层时所理解的。如果出现问题,请告诉我,我会纠正它以使其更准确。
安全组件可与防火墙配合使用。防火墙定义了一个由安全组件负责的“区域”。
对于每个防火墙,您通常会匹配与当前请求匹配的模式。如果匹配,则安全组件尝试确定是否允许请求访问资源。
为此,安全组件分为两个步骤:
首先:验证用户。如果用户未经过身份验证,我们无法授权他。因此,组件将通过其身份验证管理器以验证用户身份。以Symfony方式对用户进行身份验证意味着尝试创建令牌(实际上是一个 TokenInterface 类的实例),与当前要进行身份验证的请求相匹配,然后尝试对其进行身份验证。
这个令牌应该由Authentication Listener(实现 ListenerInterface 接口的类)创建。例如,通常会使用UserProvider将User设置为Token对象。
然后,当创建令牌时,并不意味着令牌已经过身份验证。验证管理器将验证此令牌。经常使用的一种身份验证管理器基于提供程序,它将检查当前令牌的凭据(或其他内容)是否有问题。例如, DaoAuthenticationProvider 将检查令牌用户提供的密码是否与我们的用户提供商提供给我们的密码匹配。如果没有,则失败:另一个提供商可以验证当前令牌,或者这将是验证失败。
http://symfony.com/doc/current/components/security/firewall.html
第二:授权用户。为此,我建议您在线阅读Symfony文档中有关它的章节。 You can find it here。它基于 AccessDecisionManager ,它将根据经过身份验证的令牌确定当前用户现在是允许来访问资源。这通常归功于名为选民的类投票,以决定是否允许用户访问当前资源。
投票人可以投票否,另一个人可以投票是,另一个人可以投票我不知道。最终的决定是从 AccessDecisionManager 做出的,根据它的配置方式,确定这些投票是否允许用户(“任何是允许用户”或禁止他(“任何不是”)严格“)。
我认为这是我应该了解的关于安全组件的基础。请记住,首先要理解它可能非常棘手,尤其是身份验证部分。
最后但同样重要的是,强烈建议您阅读整章:Here !。如果你想了解这个棘手但令人敬畏的组件中发生的事情,这是关键和你的圣经。
现在,对于您的登录问题:对您有用的是检查如何创建自定义侦听器(请参阅我的答案的身份验证部分),以便创建自己的业务逻辑“我如何根据当前请求对我的用户进行身份验证”。您的表单将成为防火墙区域的入口点,然后指向此防火墙区域。此侦听器将检查表单提供的信息是否在请求中,然后创建令牌。然后,由于您提供的信息,您可以通过自定义方式验证您的令牌。
(抱歉我的英文!)