支持该方法算法依赖于您的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一个>密码编码器。
为了使这个工作,只要确保你有你的用户类的编码器(如。Acme \ UserBundle \实体\用户
)配置下编码器
关键在应用程序/配置/ security.yml
。
谨慎
当你允许用户提交一个明文密码(如注册表单,更改密码的形式),你必须验证,保证密码是4096个字符或更少。了解更多细节<一个href=”https://欧宝娱乐app下载地址www.oldmanjams.com/做c/2.4/cookbook/doctrine/registration_form.html" class="reference internal">如何实现一个简单的注册表单吗一个>。
在一个控制器可以快捷方式:
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 ()一个>方法:
1
<p>用户名:{{app.user。用户名}}< /p>
现在,所有将使用的身份验证机制chain_provider
,因为它是第一个指定。的chain_provider
反过来,尝试加载用户的in_memory
和user_db
提供者。
您还可以配置防火墙和个人身份验证机制使用特定的提供者。再一次,除非显式地指定一个提供者,第一供应商总是使用:
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配置(“安全”)一个>。
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_ANONYMOUSLY
与isGranted
函数;is_remember_me
:相似,但不等于IS_AUTHENTICATED_REMEMBERED
见下文;is_fully_authenticated
:相似,但不等于IS_AUTHENTICATED_FULLY
见下文;has_role
:检查用户给定的角色——相当于一个表达式“ROLE_ADMIN”角色
。在这里,access1美元
和access2美元
将相同的值。不同的行为IS_AUTHENTICATED_REMEMBERED
和IS_AUTHENTICATED_FULLY
,is_remember_me
函数只有返回true,如果通过一个记得我的饼干和用户身份验证is_fully_authenticated
只有返回true,如果用户已经登录在这个会话(即是成熟的)。
请注意
如果你使用这个函数不在URL后面防火墙活跃,就会抛出一个异常。再一次,这是几乎总是一个好主意有防火墙主要覆盖所有url(如已被证明在这一章)。
2。4< /span>
的表达式
功能是在Symfony 2.4中引入的。欧宝娱乐app下载地址
您还可以使用表达式在你的模板:
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">安全一个>。
请注意
如果你使用一个表单登录,Symfony将创建一个c欧宝娱乐app下载地址ookie即使你设置无状态的
来真正的
。
Symf欧宝娱乐app下载地址ony的安全组件提供了一系列漂亮的与安全相关的实用程序。这些实用程序使用Symfony,但你也应该使用它们,如果欧宝娱乐app下载地址你想解决这个问题他们解决。
的<一个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
。