适用于api的Silex security.access_rules

时间:2015-09-08 18:09:53

标签: security silex

我试图了解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('^/', '')
    )
));

1 个答案:

答案 0 :(得分:1)

Symfony Security组件以双向步骤工作:身份验证和授权。

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

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

现在你可能想知道,哇,这很好,但这又如何适合我的防火墙配置?这很简单,授权部分由 security.firewalls 配置条目决定,而授权部分由 security.access_rules 统治(这是一个简化,见下文)。

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

说了这么多,关于这两个步骤的真正酷的事情是每一步都与另一步是隔离的。您可以使用您想要的任何方法进行身份验证(用户/密码表单,HTTP基本身份验证,API令牌等等),授权仍然有效。

为了让事情更清楚(希望如此),请求是这样的:

  1. 客户请求资源(URI)
  2. 防火墙侦听器捕获请求,如果URI位于受保护路径后面(使用 firewall 部分中的模式配置参数进行检查),则验证过程开始< / LI>
  3. 在API令牌身份验证过程中,您通常会从标头检查令牌(这取决于您的实现),如果令牌有效,则对用户进行身份验证,并且角色为IS_FULLY_AUTHENTICATED(否则会引发异常,内核负责处理它,所以不用担心。)
  4. 现在轮到授权经理了。它的工作是问:用户是否需要特殊角色来访问所请求的URI? (根据防火墙部分的模式参数和 access_rules 配置参数进行检查),如果当前请求中没有适用的访问规则,则唯一的检查是用户是否经过身份验证(由于步骤3,symfony会知道)。
  5. 所以回答你的问题

    • 没有必要使用表单登录来保护资源(URI),您可以使用任何默认方法或创建自己的方法(在您的情况下为API令牌),授权将起作用。
    • 如果您使用基于角色的URI访问权限,则只需要访问规则,如果您只需要经过身份验证的用户,则不需要访问规则。
    PS:Symfony安全组件比这更复杂,我尽力为您提供概述,同时努力使事情简单明了(同时省略匿名用户,在会话中存储凭据和一些复杂的案例作为ACL和选民)