提示

标准的Symfony分欧宝娱乐app下载地址布分离(如安全配置到一个单独的文件。应用程序/配置/ security.yml)。如果你没有一个单独的安全文件,你可以把配置直接进入你的主要配置文件(如应用程序/配置/ config.yml)。

这个配置的最终结果是一个全功能的安全系统看起来像下面的:

  • 有两个用户系统(瑞安管理);
  • 通过基本的HTTP身份验证提示用户验证自己;
  • 任何URL匹配/管理/ *是安全的,只有吗管理用户可以访问它;
  • 所有url匹配/管理/ *所有用户都可以访问(和用户永远不会提示登录)。

读这简短的摘要安全是如何工作的以及如何配置的每个部分。

这是第一次因为防火墙允许匿名用户通过匿名配置参数。换句话说,防火墙不需要用户立即充分验证。因为没有特别的角色需要访问/ foo(下access_control部分),请求可以完成没有要求用户进行身份验证。

如果你删除匿名键,防火墙总是立即让用户充分验证。

/管理/ foo然而,这个过程表现不同。这是由于access_control配置节说,任何匹配正则表达式模式的URL^ /管理(即。/管理或任何匹配/管理/ *)要求ROLE_ADMIN的角色。角色的基础最授权:用户可以访问/管理/ foo只有它ROLE_ADMIN的角色。

像以前一样,当用户最初发出请求时,防火墙并不要求任何证件。然而,只要访问控制层否认用户访问(因为匿名用户没有ROLE_ADMIN防火墙的作用),跳进行动,提升者身份验证过程。身份验证过程取决于您所使用的身份验证机制。例如,如果您正在使用表单登录身份验证方法,用户将被重定向到登录页面。如果你使用HTTP身份验证,用户将会发送一个HTTP 401响应,用户看到的用户名和密码框。

用户现在有机会提交凭证回到应用程序。如果证书是有效的,原始请求可以重试。

在这个例子中,用户瑞安成功验证防火墙。但自瑞安没有ROLE_ADMIN角色,他们仍然拒绝/管理/ foo。最终,这意味着用户将看到一些消息,表明访问被拒绝。

提示

Symfo欧宝娱乐app下载地址ny否认用户访问时,用户将看到一个错误屏幕和接收HTTP状态码(403被禁止的)。您可以定制拒绝访问错误屏幕遵循的方向<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/cookbook/controller/error_pages.html" class="reference internal">错误页面食谱进入自定义403错误页面。

最后,如果管理用户请求/管理/ foo,类似的过程,除了现在,被认证后,访问控制层会让请求通过:

请求流,当一个用户请求受保护的资源很简单,但是非常灵活。稍后您将看到,身份验证可以在任意数量的处理方式,包括通过表单登录证书或认证用户通过Twitter。不管身份验证方法,请求流总是一样的:

  1. 一个用户访问受保护的资源;
  2. 应用程序将用户重定向到登录表单;
  3. 用户提交的凭证(例如用户名/密码);
  4. 防火墙对用户进行身份验证;
  5. 原始请求的经过身份验证的用户再试。

请注意

确切的过程真的有点取决于你使用的身份验证机制。例如,当使用表单登录,用户提交的凭证(如一个URL处理形式。/ login_check),然后重定向回原来请求的URL(例如/管理/ foo)。但由于HTTP身份验证,用户提交的凭证直接原始URL(例如。/管理/ foo),然后在页面返回给用户在同一请求(即没有重定向)。

这些类型的特质不应该使你任何问题,但它们好好记住。

提示

您还将了解如何任何东西在Symfony可以担保,包括特定的欧宝娱乐app下载地址控制器,对象,甚至PHP方法。

到目前为止,您已经看到了如何全面应用程序防火墙下然后保护进入某些领域的角色。通过使用HTTP身份验证,您可以轻松地进入本机所有的浏览器提供的用户名/密码框。然而,Symfon欧宝娱乐app下载地址y开箱即用的支持许多身份验证机制。在所有的详细信息,请参见<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/reference/configuration/security.html" class="reference internal">安全配置参考

在本节中,你会提高这个过程通过允许用户通过传统的HTML登录表单验证。

首先,启用表单登录在防火墙:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9
# app / config / security.yml安全:防火墙:secured_area:模式:^ /匿名:~form_login:login_path:登录check_path:login_check

提示

如果你不需要定制login_pathcheck_path值(这里使用的值是默认值),可以缩短你的配置:

  • YAML
  • XML
  • PHP
1
form_login:~

现在,当安全系统启动验证过程,它会将用户重定向到登录表单(/登录默认情况下)。你的工作是实现这个登录表单视觉。首先,创建你安全配置中使用的两种途径:登录路线将显示登录表单(即。/登录)和login_check路线将处理登录表单提交(即。/ login_check):

  • YAML
  • XML
1 2 3 4 5 6
# app / config / routing.yml登录:路径:/登录默认值:{_controller:AcmeSecurityBundle:安全:登录}login_check:路径:/ login_check

请注意

你会需要实现的控制器/ login_checkURL作为防火墙会自动捕获和处理任何形式提交这个URL。然而,你必须有一个路线(如下所示),该URL,以及一个用于注销路径(看到了吗<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/book/security.html" class="reference internal">安全)。

注意到的名称登录路线匹配login_path配置值,这就是安全系统将重定向用户需要登录。

接下来,创建控制器显示登录表单:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38
/ / src / Acme / SecurityBundle /控制器/ SecurityController.php;名称空间Acme\SecurityBundle\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\控制器;使用欧宝娱乐app下载地址\组件\HttpFoundation\请求;使用欧宝娱乐app下载地址\组件\安全\核心\SecurityContextInterface;SecurityController扩展控制器{公共函数loginAction(请求美元请求){美元会话=美元请求- >getSession ();/ /得到登录如果有一个错误如果(美元请求- >属性- >(SecurityContextInterface::AUTHENTICATION_ERROR)) {美元错误=美元请求- >属性- >get (SecurityContextInterface::AUTHENTICATION_ERROR);}elseif(= = !美元会话& &美元会话- >(SecurityContextInterface::AUTHENTICATION_ERROR)) {美元错误=美元会话- >get (SecurityContextInterface::AUTHENTICATION_ERROR);美元会话- >remove (SecurityContextInterface::AUTHENTICATION_ERROR);}其他的{美元错误=;}/ /最后一个用户输入的用户名美元lastUsername= (= = =美元会话)?:美元会话- >get (SecurityContextInterface::LAST_USERNAME);返回美元- >呈现(“AcmeSecurityBundle:安全:login.html.twig”,数组(/ /最后一个用户输入的用户名“last_username”= >美元lastUsername,“错误”= >美元错误));}}

不要让这个控制器迷惑你。你会看到,当用户提交表单时,安全系统自动为您处理表单提交。如果用户提交了一个无效的用户名或密码,该控制器读取表单提交错误的安全系统,以便它可以显示给用户。

换句话说,你的工作是显示登录表单和任何可能发生的登录错误,但是安全系统本身负责检查提交的用户名和密码,验证用户。

最后,创建相应的模板:

  • 嫩枝
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
{# src / Acme / SecurityBundle /资源/视图/安全/ login.html。树枝#}{%如果错误%}<div>{{错误。消息}}< /div>{%endif%}<形式行动={{路径(login_check)}}方法=“职位”><标签=“用户名”>用户名:< /标签><输入类型=“文本”id=“用户名”的名字=“_username”价值={{last_username}}/ ><标签=“密码”>密码:< /标签><输入类型=“密码”id=“密码”的名字=“_password”/ >{#如果你想控制用户的URL重定向到成功(更多细节下文)< input type = "隐藏" name =“_target_path”价值= " /帐户" / > #}<按钮类型=“提交”>登录< /按钮>< /形式>

谨慎

这个登录表单目前不是防止CSRF攻击。读<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/cookbook/security/csrf_in_login_form.html" class="reference internal">在登录表单使用CSRF保护如何保护你的登录表单。

提示

错误变量传递到模板的一个实例<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/Security/Core/Exception/AuthenticationException.php" class="reference external" title="AuthenticationException”rel="external noopener noreferrer" target="_blank">AuthenticationException。它可能包含更多的信息,甚至敏感信息——关于身份验证失败,所以明智的使用它!

有很少的要求。首先,通过提交表单/ login_check(通过login_check路线),安全系统将拦截为您自动表单提交和处理形式。第二,安全系统预计提交的字段_username_password(这些字段名称<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/reference/configuration/security.html" class="reference internal">配置)。

这是它!提交表单时,安全系统将自动检查用户的证书和认证用户或发回用户的登录表单可以显示错误。

回顾整个过程:

  1. 用户试图访问资源的保护;
  2. 防火墙启动身份验证过程的重定向用户登录表单(/登录);
  3. /登录页面登录表单通过这个示例中创建的路线和控制器;
  4. 用户提交登录表单/ login_check;
  5. 安全系统拦截请求,检查用户提交的凭证,对用户进行身份验证,如果他们是正确的,并发送用户登录表单,如果他们不是。

默认情况下,如果提交的凭证是正确的,用户将被重定向到请求的原始页面(如。/管理/ foo)。如果用户最初直接进入登录页面,他会重定向到主页。这可能是高度定制的,允许你,例如,将用户重定向到一个特定的URL。

为更多的细节在这和如何自定义表单登录过程一般来说,明白了<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/cookbook/security/form_login.html" class="reference internal">如何自定义表单登录吗

设置登录表单时,注意一些常见的陷阱。

1。创建正确的路线

首先,确保您已经定义了登录login_check路线正确,他们对应login_pathcheck_path配置值。一个错误配置可能意味着你重定向到一个404页的登录页面,或者提交登录表单并没有(你只是一遍又一遍地看到登录表单)。

2。确保登录页面不安全

同时,确保登录页面需要查看任何角色。例如,下面的配置——要求ROLE_ADMIN角色(包括所有的url/登录URL),将导致一个重定向循环:

  • YAML
  • XML
  • PHP
1 2 3 4 5
# app / config / security.yml#……access_control:- - - - - -{路径:^ /,角色:ROLE_ADMIN}

删除的访问控制/登录URL修复存在的问题:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6
# app / config / security.yml#……access_control:- - - - - -{路径:^ /登录,角色:IS_AUTHENTICATED_ANONYMOUSLY}- - - - - -{路径:^ /,角色:ROLE_ADMIN}

另外,如果您的防火墙允许匿名用户,您将需要创建一个特殊的防火墙允许匿名用户登录页面:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10
# app / config / security.yml#……防火墙:login_firewall:模式:^ /登录美元匿名:~secured_area:模式:^ /form_login:~

3所示。确保/ login_check防火墙后面

接下来,确保你的check_pathURL(例如。/ login_check)是在防火墙之后你使用表单登录(在这个例子中,单一防火墙匹配所有url,包括/ login_check)。如果/ login_check不匹配任何防火墙,您将收到无法找到控制器路径“/ login_check”例外。

4所示。多个防火墙不共享安全上下文

如果你对一个防火墙,使用多个防火墙和您进行身份验证自动验证对任何其他防火墙。不同的防火墙就像不同的安全系统。要做到这一点,你必须显式地指定相同的<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/reference/configuration/security.html" class="reference internal">SecurityBundle配置(“安全”)对于不同的防火墙。但是通常对于大多数应用程序,有一个主要的防火墙就足够了。

5。路由错误页面不受防火墙

路由是做之前安全、路由错误页面不受任何防火墙。这意味着你不能检查安全甚至访问这些页面上的用户对象。看到<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/cookbook/controller/error_pages.html" class="reference internal">如何自定义错误页面吗为更多的细节。

< /div>

  • 用户有一组特定的角色;
  • 一个资源需要一个特定的角色来访问。
  • 在本节中,您将重点放在如何获得不同的资源(例如url、方法调用等)具有不同的角色。之后,您将了解更多关于如何创建并分配给用户的角色。

    ^ /管理要求ROLE_ADMIN的角色。

    你可以定义你需要尽可能多的URL模式——每一个正则表达式。

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6
    # app / config / security.yml安全:#……access_control:- - - - - -{路径:^ /管理/用户,角色:ROLE_SUPER_ADMIN}- - - - - -{路径:^ /管理,角色:ROLE_ADMIN}

    提示

    将路径与^确保只有url开始模式匹配。例如,一个简单的路径/管理(没有^)正确匹配/管理/ foo但也会匹配的url/ foo /管理

    access_control作品< /h3>

    为每个传入请求,Symfony检查欧宝娱乐app下载地址access_control进入找到一个相匹配的当前请求。一旦它找到一个匹配access_control条目,它停止,只有第一个匹配access_control是用来执行访问。

    每一个access_control有几个选项,配置两个不同的东西:

    1. 传入的请求应该匹配这个访问控制条目吗< /li>
    2. 一旦匹配,某种形式的访问限制应执行:

    RequestMatcher为每一个access_control条目,决定是否应该使用一个给定的访问控制请求。以下access_control选项用于匹配:

    • 路径
    • 知识产权“诱导多能性”
    • 主机
    • 方法

    采取以下access_control条目为例:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8
    # app / config / security.yml安全:#……access_control:- - - - - -{路径:^ /管理,角色:ROLE_USER_IP,知识产权:127.0。0< /span>。1}- - - - - -{路径:^ /管理,角色:ROLE_USER_HOST,主持人:欧宝娱乐app下载地址symfony \ com美元}- - - - - -{路径:^ /管理,角色:ROLE_USER_METHOD,方法:(帖子,把)}- - - - - -{路径:^ /管理,角色:ROLE_USER}

    对于每个传入请求,Symfony将决定哪个欧宝娱乐app下载地址access_control使用基于URI,客户机的IP地址,输入主机名,请求方法。记住,第一个规则相匹配,如果知识产权,主机方法不指定一个条目,access_control将匹配任何知识产权,主机方法:

    URI 知识产权 主机 方法 access_control 为什么?
    /管理/用户 127.0.0.1 example.com 得到 规则# 1 (ROLE_USER_IP) URI匹配路径和IP匹配知识产权
    /管理/用户 127.0.0.1 欧宝娱乐app下载地址www.oldmanjams.com 得到 规则# 1 (ROLE_USER_IP) 路径知识产权还是比赛。这也符合ROLE_USER_HOST条目,但只有第一个access_control匹配使用。
    /管理/用户 168.0.0.1 欧宝娱乐app下载地址www.oldmanjams.com 得到 规则# 2 (ROLE_USER_HOST) 知识产权第一个规则不匹配,所以第二个规则(匹配)。
    /管理/用户 168.0.0.1 欧宝娱乐app下载地址www.oldmanjams.com 帖子 规则# 2 (ROLE_USER_HOST) 第二条规则匹配。这也符合第三个规则(ROLE_USER_METHOD),但只有第一个匹配access_control使用。
    /管理/用户 168.0.0.1 example.com 帖子 规则# 3 (ROLE_USER_METHOD) 知识产权主机不匹配第一个两个条目,但第三ROLE_USER_METHOD——匹配和使用。
    /管理/用户 168.0.0.1 example.com 得到 规则# 4 (ROLE_USER) 知识产权,主机方法防止前三个条目匹配。但自从URI匹配路径模式的ROLE_USER条目,使用它。
    / foo 127.0.0.1 欧宝娱乐app下载地址www.oldmanjams.com 帖子 没有匹配的条目 这并不匹配任何access_control规则,因为它的URI不匹配的任何路径值。

    谨慎

    正如您将在下面解释的例子,知识产权选项不限制到一个特定的IP地址。相反,使用知识产权关键意味着access_control条目只会匹配这个IP地址,用户访问它从一个不同的IP地址将继续下降access_control列表。

    这里有一个例子如何保障所有应急服务国际公司的路线,从一个给定的前缀,/应急服务国际公司从外部访问:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6
    # app / config / security.yml安全:#……access_control:- - - - - -{路径:^ /应急服务国际公司,角色:IS_AUTHENTICATED_ANONYMOUSLY,“诱导多能性”:(127.0.0.1,:1):}- - - - - -{路径:^ /应急服务国际公司,角色:ROLE_NO_ACCESS}

    这是它是如何工作的路径/ esi /东西来自10.0.0.1知识产权:

    • 第一个访问控制规则是忽略的路径比赛,但知识产权不匹配的ip列表;
    • 第二次访问控制规则启用(唯一的限制路径和它匹配):用户不能有ROLE_NO_ACCESS角色不是定义,访问被拒绝ROLE_NO_ACCESS角色可以是任何不匹配现有的角色,它只是作为一个技巧总是拒绝访问)。

    现在,如果来自相同的请求127.0.0.1::1(IPv6回环地址):

    • 现在,第一个启用访问控制规则的路径知识产权匹配:允许访问用户总是IS_AUTHENTICATED_ANONYMOUSLY的角色。
    • 第二次访问规则并不像第一条规则匹配的检查。

    一旦一个access_control条目相匹配,可以通过拒绝访问角色键或使用更复杂的逻辑的一个表达式allow_if关键:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7
    # app / config / security.yml安全:#……access_control:- - - - - -路径:^ / _internal /安全allow_if:“127.0.0.1 = = request.getClientIp()或has_role (ROLE_ADMIN)”

    在这种情况下,当用户试图访问任何URL开始/ _internal /安全,他们将只被授予访问IP地址127.0.0.1或者用户ROLE_ADMIN的角色。

    内的表达,你可以访问许多不同的变量和函数请求,这是Symfony欧宝娱乐app下载地址<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/HttpFoundation/Request.php" class="reference external" title="请求”rel="external noopener noreferrer" target="_blank">请求对象(如<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/components/http_foundation/introduction.html" class="reference internal">HttpFoundation组件)。

    其他的函数和变量的列表,看看<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/book/security.html" class="reference internal">函数和变量

    由于SensioFrameworkExtraBundle,你也可以获得你的控制器使用注释:

    1 2 3 4 5 6 7 8 9 10
    / /……使用Sensio赞助\\FrameworkExtraBundle\配置\安全;/ * * *@Security(“has_role (ROLE_ADMIN)”) * /公共函数helloAction(美元的名字){/ /……}

    有关更多信息,请参见FrameworkExtraBundle文档。欧宝体育电话

    如何确保您的应用程序的服务或方法吗

    如何使用访问控制列表(acl)

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8 9
    # app / config / security.yml安全:#……提供者:default_provider:记忆:用户:雷恩:{密码:ryanpass,角色:“ROLE_USER”}管理:{密码:小猫,角色:“ROLE_ADMIN”}

    这个用户提供者称为“内存”用户提供者,因为用户不存储在数据库中。Symfony提供的实际用户对象(欧宝娱乐app下载地址<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/Security/Core/User/User.php" class="reference external" title="用户”rel="external noopener noreferrer" target="_blank">用户)。

    提示

    任何用户提供者可以通过指定加载用户直接从配置用户配置参数和清单下面的用户。

    谨慎

    如果你的用户名是完全数字(如。77年)或含有少量(如。用户名),你应该使用一个替代语法在YAML当指定用户:

    1 2 3
    用户:- - - - - -{名称:77年,密码:通过,角色:“ROLE_USER”}- - - - - -{名称:用户名,密码:通过,角色:“ROLE_USER”}

    小网站,这个方法是快速和容易的设置。对于更复杂的系统,你需要从数据库中加载您的用户。

    使用这种方法,您将首先创建你自己的用户类,它将被存储在数据库中。

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
    / / src / Acme / / User.php UserBundle /实体名称空间Acme\UserBundle\实体;使用欧宝娱乐app下载地址\组件\安全\核心\用户\用户界面;使用学说\ORM\映射作为ORM;/ * * *@ORM实体\ * /用户实现了用户界面{/ * * *@ORM\列(类型=“字符串”,长度= 255)* /受保护的美元用户名;/ /……}

    安全系统而言,唯一的要求为您定制的用户类,它实现了<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/Security/Core/User/UserInterface.php" class="reference external" title="用户界面”rel="external noopener noreferrer" target="_blank">用户界面接口。这意味着您的“用户”的概念可以是任何东西,只要它实现了这个接口。

    请注意

    用户对象将被序列化并保存在会话请求,因此建议您<一个href=”http://php.net/manual/en/class.serializable.php" class="reference external" rel="external noopener noreferrer" target="_blank">实现\ Serializable接口在你的用户对象。如果你这一点尤为重要用户类都有一个父类与私人性质。

    接下来,配置一个实体用户提供者,点到你用户类:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7
    # app / config / security.yml安全:提供者:主要:实体:类:Acme \ UserBundle \实体\用户属性:用户名

    通过引入新的供应商,身份验证系统将尝试加载用户对象从数据库中使用用户名该类的领域。

    请注意

    这个例子只是为了告诉你背后的基本思想实体提供者。一个完整的工作示例,请参阅<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/cookbook/security/entity_provider.html" class="reference internal">如何从数据库中加载安全用户(实体提供者)

    有关创建您自己的自定义服务提供方程序的更多信息(例如,如果您需要加载用户通过一个web服务),看到的<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/cookbook/security/custom_provider.html" class="reference internal">如何创建一个自定义用户提供者

    bcrypt,请执行以下操作:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
    # app / config / security.yml安全:#……提供者:in_memory:记忆:用户:雷恩:密码:2美元12 w / aHvnC / XNeDVrrl65b3dept8QcKqpADxUlbraVXXsC03Jam5hvoO美元角色:“ROLE_USER”管理:密码:2美元12 HmOsqRDJK0HuMDQ5Fb2.AOLMQHyNHGD0seyjU3lEVusjT72QQEIpW美元角色:“ROLE_ADMIN”编码器:欧宝娱乐app下载地址Symfony核心组件\ \安全\ \ \用户:算法:bcrypt成本:12

    2。2< /span>

    BCrypt编码器在Symfony 2.2中引入的。欧宝娱乐app下载地址

    你现在可以以编程方式(如计算散列密码。password_hash (ryanpass, PASSWORD_BCRYPT阵列(“成本”= > 12));)或通过一些在线工具。

    谨慎

    如果你使用PHP 5.4或更低,您需要安装ircmaxell / password-compat图书馆通过作曲家为了能够使用bcrypt编码器:

    1 2 3 4 5 6
    {“需要”:{…“ircmaxell / password-compat”:“~ 1.0.3”}}

    支持该方法算法依赖于您的PHP版本。一个完整的列表可以通过调用PHP函数<一个href=”https://secure.php.net/manual/en/function.hash-algos.php" class="reference external" title="hash_algos”rel="external noopener noreferrer" target="_blank">hash_algos

    2。2< /span>

    您还可以使用欧宝娱乐app下载地址Symfony的2.2<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/reference/configuration/security.html" class="reference internal">PBKDF2密码编码器。

    1 2 3 4 5 6
    美元工厂=美元- >get (“security.encoder_factory”);美元用户=Acme \ UserBundle \ \用户实体();美元编码器=美元工厂- >getEncoder (美元用户);美元密码=美元编码器- >encodePassword (“ryanpass”,美元用户- >getSalt ());美元用户- >向setPassword (美元密码);

    为了使这个工作,只要确保你有你的用户类的编码器(如。Acme \ UserBundle \实体\用户)配置下编码器关键在应用程序/配置/ security.yml

    谨慎

    当你允许用户提交一个明文密码(如注册表单,更改密码的形式),你必须验证,保证密码是4096个字符或更少。了解更多细节<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/cookbook/doctrine/registration_form.html" class="reference internal">如何实现一个简单的注册表单吗

    < /div>

    在一个控制器可以快捷方式:

    1 2 3 4
    公共函数indexAction(){美元用户=美元- >getUser ();}

    请注意

    匿名用户在技术上进行身份验证,这意味着isAuthenticated ()一个匿名用户对象的方法将返回true。检查用户是否实际上是经过验证的,检查的IS_AUTHENTICATED_FULLY的角色。

    在一个树枝模板可以通过访问这个对象app.user调用的关键<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Bundle/FrameworkBundle/Templating/GlobalVariables.php" class="reference external" title="GlobalVariables: getUser ()”rel="external noopener noreferrer" target="_blank">GlobalVariables: getUser ()方法:

    • 嫩枝
    • PHP
    1
    <p>用户名:{{app.user。用户名}}< /p>

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8 9 10 11 12
    # app / config / security.yml安全:提供者:chain_provider:链:提供者:[in_memory,user_db]in_memory:记忆:用户:foo:{密码:测试}user_db:实体:{类:Acme \ UserBundle \ \用户实体,属性:用户名}

    现在,所有将使用的身份验证机制chain_provider,因为它是第一个指定。的chain_provider反过来,尝试加载用户的in_memoryuser_db提供者。

    您还可以配置防火墙和个人身份验证机制使用特定的提供者。再一次,除非显式地指定一个提供者,第一供应商总是使用:

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6 7 8 9 10 11
    # app / config / security.yml安全:防火墙:secured_area:#……模式:^ /供应商:user_dbhttp_basic:域:“安全演示区”供应商:in_memoryform_login:~

    在本例中,如果用户试图通过HTTP身份验证登录,身份验证系统将使用in_memory用户提供者。但是,如果用户试图通过表单登录,登录user_db提供者将使用(因为它是整个防火墙的默认值)。

    关于用户提供者和防火墙配置的更多信息,见<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/reference/configuration/security.html" class="reference internal">SecurityBundle配置(“安全”)

    在上面的配置,用户ROLE_ADMIN也会有作用ROLE_USER的角色。的ROLE_SUPER_ADMIN角色ROLE_ADMIN,ROLE_ALLOWED_TO_SWITCHROLE_USER(继承自ROLE_ADMIN)。

    1 2 3 4 5 6 7 8 9 10 11
    / /……使用欧宝娱乐app下载地址\组件\安全\核心\异常\AccessDeniedException;公共函数helloAction(美元的名字){如果(= = =美元- >get (“security.context”)- >isGranted (“ROLE_ADMIN”)){AccessDeniedException ();}/ /……}

    谨慎

    防火墙必须活跃或时将抛出一个异常isGranted ()方法被调用。它总是一个好主意有一个主要的防火墙,涵盖了所有url(如本章所示)。

    除了一个角色ROLE_ADMIN,isGranted方法还接受一个<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/ExpressionLanguage/Expression.php" class="reference external" title="表达式”rel="external noopener noreferrer" target="_blank">表达式对象:

    1 2 3 4 5 6 7 8 9 10 11 12 13 14
    使用欧宝娱乐app下载地址\组件\安全\核心\异常\AccessDeniedException;使用欧宝娱乐app下载地址\组件\ExpressionLanguage\表达式;/ /……公共函数indexAction(){如果(!美元- >get (“security.context”)- >isGranted (表达式(在角色或“ROLE_ADMIN”(用户和user.isSuperAdmin ())”))){AccessDeniedException ();}/ /……}

    在这个例子中,如果当前用户ROLE_ADMIN如果当前用户对象的isSuperAdmin ()方法返回真正的,然后将被授予访问(注:可能没有一个用户对象isSuperAdmin方法,该方法发明这个例子)。

    它使用一个表达式,您可以了解更多关于表达式语言语法,看<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/components/expression_language/syntax.html" class="reference internal">表达式语法

    内的表达,你可以访问大量的变量:

    • 用户用户对象(或字符串另一次如果你不认证);
    • 角色角色用户的数组,包括从<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/book/security.html" class="reference internal">角色层次结构但不包括IS_AUTHENTICATED_ *属性(见下面的函数);
    • 对象:对象(如果有的话)作为第二个参数传递给isGranted;
    • 令牌令牌对象;
    • trust_resolver:<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/Security/Core/Authentication/AuthenticationTrustResolverInterface.php" class="reference external" title="AuthenticationTrustResolverInterface”rel="external noopener noreferrer" target="_blank">AuthenticationTrustResolverInterface,
      对象:你可能会使用is_ *下面的函数来代替。

    此外,您可以访问内有一定数量的函数表达式:

    • is_authenticated:返回真正的如果用户通过“记住我”或验证身份验证“充分”,即返回true,如果用户是“登录”;
    • is_anonymous:等于使用IS_AUTHENTICATED_ANONYMOUSLYisGranted函数;
    • is_remember_me:相似,但不等于IS_AUTHENTICATED_REMEMBERED见下文;
    • is_fully_authenticated:相似,但不等于IS_AUTHENTICATED_FULLY见下文;
    • has_role:检查用户给定的角色——相当于一个表达式“ROLE_ADMIN”角色

    is_remember_meis_authenticated_fully函数是类似的使用IS_AUTHENTICATED_REMEMBEREDIS_AUTHENTICATED_FULLYisGranted功能——但它们相同的。以下显示的区别:

    1 2 3 4 5 6 7 8 9
    使用欧宝娱乐app下载地址\组件\ExpressionLanguage\表达式;/ /……美元sc=美元- >get (“security.context”);美元access1=美元sc- >isGranted (“IS_AUTHENTICATED_REMEMBERED”);美元access2=美元sc- >isGranted (表达式(“is_remember_me()或is_fully_authenticated ()”));

    在这里,access1美元access2美元将相同的值。不同的行为IS_AUTHENTICATED_REMEMBEREDIS_AUTHENTICATED_FULLY,is_remember_me函数只有返回true,如果通过一个记得我的饼干和用户身份验证is_fully_authenticated只有返回true,如果用户已经登录在这个会话(即是成熟的)。

    如何确保您的应用程序的服务或方法吗

    请注意

    如果你使用这个函数在URL后面防火墙活跃,就会抛出一个异常。再一次,这是几乎总是一个好主意有防火墙主要覆盖所有url(如已被证明在这一章)。

    2。4< /span>

    表达式功能是在Symfony 2.4中引入的。欧宝娱乐app下载地址

    您还可以使用表达式在你的模板:

    • 嫩枝
    • PHP
    1 2 3 4 5
    {%如果is_granted(表达式(“ROLE_ADMIN”角色或(用户和user.isSuperAdmin ())”)) %}<一个href=“…”>删除< /一个>{%endif%}

    表情和安全的更多细节,请参阅<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/book/security.html" class="reference internal">安全

    如何使用访问控制列表(acl)

    一旦这是在你的防火墙配置,发送用户/注销(或者无论你配置路径),将un-authenticate当前用户。用户将被发送到主页(定义的值目标参数)。这两个路径目标这里指定的默认的配置参数。换句话说,除非你需要定制,你可以完全忽略他们,缩短你的配置:

    • YAML
    • XML
    • PHP
    1
    注销:~

    请注意,您将需要实现的控制器/注销URL的防火墙照顾一切。你然而,需要创建一个路线,这样您就可以使用它来生成URL:

    • YAML
    • XML
    1 2 3
    # app / config / routing.yml注销:路径:/注销

    一旦用户已经注销,他们将被重定向到任何定义的路径目标上面的参数(例如主页)。有关配置注销的更多信息,请参阅<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/reference/configuration/security.html" class="reference internal">安全配置参考

    • YAML
    • XML
    • PHP
    1 2 3 4 5 6
    # app / config / security.yml安全:防火墙:主要:http_basic:~无状态:真正的

    请注意

    如果你使用一个表单登录,Symfony将创建一个c欧宝娱乐app下载地址ookie即使你设置无状态的真正的

    2。2< /span>

    stringutilSecureRandom类是在Symfony 2.2中引入的欧宝娱乐app下载地址

    Symf欧宝娱乐app下载地址ony的安全组件提供了一系列漂亮的与安全相关的实用程序。这些实用程序使用Symfony,但你也应该使用它们,如果欧宝娱乐app下载地址你想解决这个问题他们解决。

    计时攻击

    在内部,当比较两个密码,Symfony使用常量时间算法;欧宝娱乐app下载地址您可以在您自己的代码中使用相同的策略由于<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/Security/Core/Util/StringUtils.php" class="reference external" title="stringutil”rel="external noopener noreferrer" target="_blank">stringutil类:

    1 2 3 4
    使用欧宝娱乐app下载地址\组件\安全\核心\跑龙套\stringutil;/ /等于密码2吗?美元bool= stringutil::= (美元密码,美元2);

    的<一个href=”https://github.com/symfony/symfony/blob/2.4/src/Symfony/Component/Security/Core/Util/SecureRandom.php" class="reference external" title="nextBytes ()”rel="external noopener noreferrer" target="_blank">nextBytes ()方法返回一个随机的字符串组成的字符数作为参数传递(10在上面的例子中)。

    SecureRandom类更好当安装OpenSSL但不是可用,回落到内部算法,这需要一个种子文件正常工作。只是通过文件名来启用它:

    1 2
    美元发电机=SecureRandom (' /一些/道路/ /商店/ / seed.txt ');美元随机=美元发电机- >nextBytes (10);

    请注意

    您还可以访问一个安全的随机实例直接从Symfony的依赖注入容器;欧宝娱乐app下载地址它的名字是security.secure_random

    < /div>
    这项工作,包括代码示例,许可下<一个rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/">Creative Commons冲锋队3.0许可证。

    版本:
    欧宝娱乐app下载地址Symfony代码性能”>< /一个><p类=”highlight-symfony-text欧宝娱乐app下载地址Symfony代码性能< /p>< /div> 阅读我们完整的Symfony和PHP目录欧宝娱乐app下载地址为您的web开发需要的解决方案。”>< /一个><p类=”highlight-symfony-text阅读我们完整的Symfony和PHP目录欧宝娱乐app下载地址为您的web开发需要的解决方案。< /p>< /div>< /div>< /div>