CakePHP中文手册【翻译】-安全组件
安全组件
第1节
介绍
安全组件用来保护你的controller动作不遭到恶意的或错误的请求攻击。它允许你创建某些条件,可以在这些条件下请求一个动作,而且有时候指定了如何处理那些不符合需求的请求。在使用安全组件之前,你必须确保‘Security'在你的Controller的$components数组中。
第2节
保护Controller动作
安全组件包含了2个主要方法来限制访问controller动作:
requirePost
- string $action1
- string $action2
- string $action3...
为了执行指定的动作,他们必须是POST请求。
requireAuth
- string $action1
- string $action2
- string $action3...
确保一个请求来自于应用程序,它通过检验一个在已POST的表单数据中的身份验证键,此键已经存储在用户的session里。如果身份匹配,允许动作执行。即使这样,但还是请注意,由于灵活性原因,如果表单数据实际上已经post,本检验才运行。如果通过一个常规的GET请求调用动作,requireAuth()什么事情也不做。出于最高安全考虑,你应该对你想完全保护的动作使用requirePost()和requireAuth()方法。为了得到更多关于身份验证键是如何产生的,并且它是如何结束的,参看下面的第4节。
但是,首先让我们看看一个简单的例子:
class ThingsController extends
AppController { var $components = array('Security'); function beforeFilter() {
$this->Security->requirePost('delete'); } function delete($id) {
// This will only
happen if the action is called via an HTTP POST request
$this->Thing-> } } |
在这里,我们告诉安全组件'delete'动作需要一个POST请求。beforeFilter()方法常常用在你想告诉安全(以及大多数其他组件)它们自己做什么的地方。然后在beforeFilter()调用之前,它会按告诉它的去完成。但是在调用动作本身之前也一样。
就是这些。你可以在你的浏览器里输入动作的URL,看看发生了什么,这样就可以测试它了。.
第3节
处理无效的请求
因此,如果一个请求不符合我们定义的安全需求,会发生什么呢?缺省的,请求会是一个黑洞,意思是说会给客户端发送一个404消息头,而且应用程序会立刻退出。即便如此,安全组件有一个$blackHoleCallback属性,你可以将这个属性设置为一个controller里定义的自定义回调函数名。
既然不是简单给出一个404消息头和什么都没有,此属性允许你完成一些请求的额外检验,并将请求转向到其他地方,甚至记录非法客户端的IP地址。即便如此,如果你选择使用一个自定义回调而且请求无效的话,你有责任退出应用程序。如果你的回调返回true,安全组件会继续根据其他定义的需求来检验请求。否则,他将停止检验,并且应用程序仍然不受约束。
第4节
高级的请求身份验证
requireAuth()方法允许非常详细的指明如何并且在那里访问一个动作,但是它有某些特定的使用限制,当你理解本身份验证方法是如何工作的,你就清楚了。正如上面描述的,requireAuth()会将一个在POST数据中的身份验证键与一个存储在用户session数据中的那个相比较。因此,安全组件必须包含在controller接收请求中,也必须包含在controller创建请求里。
例如,如果有一个动作在PostsController里,而且此Controller伴有一个包含POST到一个CommentsController的动作的表单的view,那么安全组件必须包含在CommentsController(它正接收请求,而且实际上保护动作)中,也必须包含在PostsController(从这里创建请求)中。
每次加载安全组件时,虽然它不会用来保护一个动作,但是它会做下面的事情:首先,它使用核心的Security类生成一个身份验证键,然后,将此键写入session,同时也有过期时间,以及某些其他的信息(过期时间由/app/config/core.php的设置决定)。接着,在你的Controller里设置该键,供后面引用。
Change History:
- Last Updated:2006年12月5日