【问题标题】:Silex security.access_rules for api用于 api 的 Silex security.access_rules
【发布时间】:2015-09-08 18:09:52
【问题描述】:

我试图了解 Silex 的防火墙和安全访问规则是如何与路径相关的。这仅在您尝试通过登录表单访问时才有效吗?您可以使用从 api 检查发回的规则吗(请参阅Proper way to configure Silex Firewall to use api keys,我正在工作)。如果可能的话,我希望能够在 SecurityServiceProvider 中设置它,而不是在控制器中。

这可能吗?

编辑:添加安全防火墙..

$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'unsecured' => array(
            'pattern' => new RequestMatcher('^/api/brand/get'))
    ),

    'security.access_rules' => array(
        array('^/api/brand/get', 'ROLE_ADMIN'),
        array('^/api/account/get', 'ROLE_ADMIN'),
        array('^/.+$', 'ROLE_USER'),
        array('^/', '')
    )
));

【问题讨论】:

  • 为什么你的防火墙被称为不安全的,你的意思是对 ^/api/brand/get 的公共访问(我不这么认为,在你的访问规则中,你只为管理员访问创建了一个约束)?此外,您的防火墙中缺少身份验证方法,因此不会调用身份验证...
  • 你指的是Definig a custom Authentication Provider?让我研究一下并添加进去。
  • 我也在关注我think you've replied to的一个帖子
  • 是的,那是我的,那里的链接很有帮助。当我告诉您您缺少身份验证方法时,我的意思是任何(自定义或 Symfony 的默认值),但是如果您尝试创建 API 令牌身份验证,那确实是自定义的(按照 Symfony 的链接doc,你会看到如何配置它)

标签: security silex


【解决方案1】:

Symfony 安全组件以两种方式工作:身份验证和授权。

身份验证部分是客户端告诉服务器他是谁(通常带有一些只有双方知道的秘密,例如密码,或者在您的情况下是 API 令牌) .当服务器检查凭据是否有效时,身份验证成功,然后是第二部分,授权(通常在 Web 应用程序中,一旦客户端通过身份验证,身份验证信息就会存储在会话中,因此在以后的请求中客户端不需要再次发送凭据并遵循身份验证过程,但在 API 令牌身份验证过程中,通常要求客户端每次都发送 API 令牌,因此此处不涉及会话。

正如我所说,一旦服务器验证了客户端凭据,就会进入 授权 过程。在这部分过程中,安全组件检查当前用户是否有足够的权限来访问所请求的资源 (URI)。这是在基于角色的模型中完成的,在进行身份验证时,用户被赋予了一些角色(经过身份验证的用户默认被赋予 IS_FULLY_AUTHENTICATED 角色)。

现在您可能会想,哇,这太棒了,但是这如何适合我的防火墙配置?这很简单,授权部分由 security.firewalls 配置条目控制,而授权部分由 security.access_rules 控制(这是一种简化,见下文)。

请注意,如果您的应用程序没有任何特殊的授权规则(您只需要经过身份验证的用户并且没有特殊权限来访问不同的资源),那么您可以不用任何访问规则(授权基于 IS_FULLY_AUTHENTICATED仅限角色)。例如,您可能需要管理面板中的特定角色。

说了这么多,这两个步骤过程的真正酷之处在于,每个步骤都是相互隔离的。您可以使用任何您想要的方法进行身份验证(用户/密码形式、HTTP 基本身份验证、API 令牌等),并且无论如何授权都会起作用。

为了让事情更清楚(希望如此),请求如下:

  1. 客户端请求资源 (URI)
  2. 防火墙侦听器捕获请求,如果 URI 位于受保护路径后面(使用 firewall 部分中的 pattern 配置参数检查),则身份验证过程开始
  3. 在 API 令牌身份验证过程中,您通常会检查标头中的令牌(但这取决于您的实现),如果令牌有效,则用户通过身份验证并且角色为 IS_FULLY_AUTHENTICATED(否则会引发异常,内核会处理它,所以不用担心)。
  4. 现在轮到授权管理器了。它的工作是询问:用户是否需要特殊角色才能访问请求的 URI? (这是根据防火墙部分的 pattern 参数和 access_rules 配置参数检查的),如果当前请求中没有应用访问规则,则唯一的检查是用户是否是已通过身份验证(symfony 将通过第 3 步知道)。

所以回答你的问题

  • 无需使用表单登录来保护资源 (URI),您可以使用任何默认方法或创建自己的方法(在您的情况下为 API 令牌),授权将起作用。
  • 如果您使用基于角色的 URI 访问权限,则只需要访问规则,如果您只需要经过身份验证的用户,则不需要访问规则。

PS:Symfony 安全组件远比这复杂得多,我已尽力为您提供概述,同时试图使事情变得简单明了(同时省略匿名用户、将凭据存储在会话中以及将一些复杂情况作为 ACL和选民)

【讨论】:

  • 编辑原始问题以包含我输入的代码。在我的实例中,我需要访问规则,因为我只希望某些 URI 被不同的访问级别访问。查看silex.sensiolabs.org/doc/providers/security.html 页面,我输入的代码似乎只是忽略了访问规则。所以我假设我的设置不正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 2012-03-19
  • 2017-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多