如何实现持久会话和饼干吗?
概述
ob娱乐下载Symfony提供了访问饼干通过sfWebRequest
和sfWebResponse
对象。它使饼干很简单的使用,和持久会话很容易实现。
饼干getter和setter
cookie是一个字符串存储在客户端计算机,由一个web应用程序和可读的只有同一个应用程序——或域。
在syob娱乐下载mfony中,饼干的setter和getter方法不同的对象,但这是有意义的。饼干,你检查发送到服务器的请求,因此使用sfWebRequest
对象。另一方面,设置cookie,您修改将被发送到用户的响应,因此使用sfWebResponse
对象。操纵饼干从内部操作,使用下面的快捷键:
/ / cookie getter美元的字符串=这个美元- >getRequest()- >getCookie(“mycookie”);/ / cookie setter这个美元- >getResponse()- >setCookie(“mycookie”,美元的价值);/ / cookie setter与选择这个美元- >getResponse()- >setCookie(“mycookie”,美元的价值,美元到期,美元的路径,美元的域,安全的美元);
的语法setCookie ()
方法是一样的一个基本的PHPsetcookie ()
函数(参考PHP手册的更多信息)。使用的主要优势sfWebResponse
symfony日志饼干的方法是ob娱乐下载,你可以继续阅读和修改直到响应实际上是发送。
请注意
如果你想操纵饼干以外的一个行动,你将需要访问请求
和回答
对象没有快捷方式:
请求= sfContext:美元:getInstance () - > getRequest ();$响应= sfContext: getInstance () - > getResponse ();
饼干用的例子:持久会话
好使用cookie(除了基本的会话处理,这是完全透明的symfony)是持久会话功能。ob娱乐下载大部分的登录表单提供了一个“记住我”复选框,单击时,允许用户绕过登录过程未来的会议。
基本的登录
假设一个应用程序是安全的,除了所有的模块安全
模块。的settings.yml
配置为处理未经身份验证的用户的请求安全/索引
行动:
:.settings: login_module:安全login_action:索引
这个模型有一个用户
与至少一个类登录
和一个密码
字段。的indexSuccess.php
模板显示了一个登录表单(没有现在的“记住我”复选框),并处理提交的安全/登录
行动:
公共函数executeIndex(){}公共函数executeLogin(){/ /检查用户是否存在$ c=新标准();$ c- >添加(UserPeer::登录,这个美元- >getRequestParameter(“登录”));$ user= UserPeer::doSelectOne($ c);如果($ user){/ /检查密码是否正确如果(这个美元- >getRequestParameter(“密码”)= =$ user- >getPassword()){/ /登录这个美元- >getContext()- >getUser()- >signIn();/ /进入主页返回这个美元- >重定向(“主/指数”);}其他的{这个美元- >getRequest()- >setError(“密码”,“密码错误”);}}其他的{这个美元- >getRequest()- >setError(“电子邮件”,“该用户不存在”);}/ /一个错误被发现返回这个美元- >向前(“安全”,“指数”);}
请注意
登录名和密码的验证也可以处理在一个定制的验证器更好的域模型逻辑,解释的使用教程。
现在,让我们来看看这个signIn ()
方法myUser
类:
类myUser扩展sfBasicSecurityUser{公共函数signIn(){这个美元- >setAuthenticated(真正的);}公共函数signOut(){这个美元- >setAuthenticated(假);}}
到目前为止这是非常基本的。但它工作正常,只要你问每个会话的用户登录。
持久会话
允许持久会话、服务器存储一些信息在客户端计算机(这是饼干吧)记住用户是谁,他/她成功登录。当然,出于安全原因,密码不能存储在cookie(顺便说一下,这将是不相容的sha1哈希密码存储方法中描述使用教程)。那么应该存储在cookie什么?无论饼干店,它必须是可以匹配的一些数据在数据库中,这两个元素的比较实现身份验证。最小化风险,一个随机的字符串将被存储和再生每15天(一生将cookie)。
通过添加一个新的remember_key
列的用户
表(和重建模型)。这个新领域将存储随机密钥,关键将被存储在客户端计算机上的饼干和数据库中用户的记录的一部分。记住关键将设置当用户请求被铭记,所以改变登录线登录
采取行动:
/ /登录记得美元=这个美元- >getRequestParameter(“remember_me”);这个美元- >getContext()- >getUser()- >signIn($ user,记得美元);
不要忘记添加一个remember_me
复选框的模块/安全/模板/ indexSuccess.php
这个工作形式。
的signIn ()
的方法myUser
类有要修改的设置记住关键数据库和饼干:
公共函数signIn($ user,记得美元=假){这个美元- >setAuthenticated(真正的);如果(记得美元){/ /确定随机密钥如果(!$ user- >getRememberKey()){rememberKey美元= myTools::generate_random_key();/ /保存用户表的关键$ user- >setRememberKey(rememberKey美元);$ user- >保存();}/ /保存cookie的关键美元的价值=base64_encode(序列化(数组($ user- >getRememberKey(),$ user- >getLogin())));sfContext::getInstance()- >getResponse()- >setCookie(“MyWebSite”,美元的价值,时间()+ 60*60*24*15,' / ');}}
的generate_random_key ()
方法可以是任何东西,你选择满足安全需求。现在,你只需要改变安全/索引
行动一点:
公共函数executeIndex(){如果(这个美元- >getRequest()- >getCookie(“MyWebSite”)){美元的价值=非系列化(base64_decode(这个美元- >getRequest()- >getCookie(“MyWebSite”)));$ c=新标准();$ c- >添加(UserPeer::REMEMBER_KEY,美元的价值(0]);$ c- >添加(UserPeer::登录,美元的价值(1]);$ user= UserPeer::doSelectOne($ c);如果($ user){/ /登录这个美元- >getContext()- >getUser()- >signIn($ user);/ /进入主页返回这个美元- >重定向(“主/指数”);}}}
这个新进程读取cookie和你完成。
请注意
如果一些页面可以访问你的网站不需要身份验证,那么安全/索引
行动不再是第一个行动每次执行。为了自动记录用户在这种情况下,你可能更愿意添加一个新的rememberFilter
在您的应用程序lib /
目录,而不是做饼干的检查在一个单一的行动:
类rememberFilter扩展sfFilter{公共函数执行(filterChain美元){/ /执行这个过滤一次如果(这个美元- >isFirstCall()){如果(美元的饼干=这个美元- >getContext()- >getRequest()- >getCookie(“MyWebSite”)){美元的价值=非系列化(base64_decode(美元的饼干));$ c=新标准();$ c- >添加(UserPeer::REMEMBER_KEY,美元的价值(0]);$ c- >添加(UserPeer::登录,美元的价值(1]);$ user= UserPeer::doSelectOne($ c);如果($ user){/ /登录这个美元- >getContext()- >getUser()- >signIn($ user);}}}/ /执行下一个过滤器filterChain美元- >执行();}}
当然,你将不得不宣布这个过滤器在您的应用程序filters.yml
配置文件:
rememberFilter:类:rememberFilter
最后一件事:如果用户注销,别忘了删除饼干!
公共函数signOut(){这个美元- >setAuthenticated(假);sfContext::getInstance()- >getResponse()- >setCookie(“MyWebSite”,”,时间()- - - - - -3600年,' / ');}
请注意
这个解决方案只适用于不安全的网页,因为安全检查安全页面之前自定义还记得
过滤器。因此,如果一个用户在一个适当的饼干试图访问一个安全网站页面没有记录在一个不安全的网页,他/她将被重定向到登录页面其他任何人。如果你想记得我特性工作安全页面,实现略有不同。您必须创建一个myBasicSecurityFilter
类专业sfBasicSecurityFilter
类,把饼干控制。然后,在filters.yml
,改变的名称security_filter
类来这myBasicSecurityFilter
。实现的细节留给你的睿智。
持久的会话:不要重新发明轮子
上面的代码种可以相当痛苦重写每一个新项目。幸运的是,您可以使用sfGuardPlugin
为这个目的。它不仅自动化用户管理、权限与数据库和凭证,它还包括“记住我”功能类似,这里描述的技术。因此,使持久性会话的好方法安装sfGuard插件。
这个工作许可适用创作共用署名下衍生著作3.0 Unported许可执照。