> CakePHP中文手册 > The Security Component

The Security Component

Section1 简介

Security component可以用来保护你的controller action不受恶意的,错误的请求侵入。你可以定制action请求条件,并且可以定义如何处理那些不满足条件的请求。再说一次,使用前,请先把Security component加到controller的$components array中。

Section 2 保护Controller Action

该组件包含两个主要的函数来限制对action的访问:

requirePost 
  string $action1 
  string $action2 
  string $action3...
		

指定某些action必须通过POST方式访问。

requireAuth 
  string $action1 
  string $action2 
  string $action3... 
		

确保每一个请求都经过认证校验,校验内容为POST提交过来的数据中的认证key和存储在User session中的认证key。如果两者匹配,则允许执行action动作。注意,为了保证程序的扩展性,只有在POST提交方式才会触发校验动作。如果action是由常规的GET方式请求触发,校验函数不会执行任何校验动作。为了确保最完整的安全机制,你最好组合使用requirePost() 和 requireAuth()两个函数,保证那些希望完全保护的action得到保护。在Section 4中会介绍如何生成认证key以及key的生命期。

这里,我们指定 'delete' action必须由POST方式提交请求。beforeFilter()函数通常用来通知Security(和大多数其他Component)Component来执行各自的操作。在action被真正执行之前,这些Component能完成自身被调用的动作。

你可以在地址栏输入该action的URL来测试,你会发现刚才定义的安全校验已经生效了。

Section 3 处理不合法的请求

如果有的请求不能满足我们刚才定义的安全校验条件,那会发生什么情况呢?默认情况下,该请求会石沉大海,换句话说,你将看到一个404错误,立即退出程序。然而,Security Component中有一个 $blackHoleCallback 属性,你可以设置一个回调函数来处理这些不合法的请求。

与直接返回一个404错误相比,通过回调函数可以执行一些额外的校验,重定向请求,或者记录客户端IP。如果你使用了回调函数来处理这些,那退出应用程序的责任也将由你承担。如果回调函数返回true,Security Component会继续执行其他的安全校验规则。反之则停止校验但程序并未得到终止。

Section 4 高级请求验证

requireAuth()函数允许你非常细致的校验是否允许访问一个action,不过这是基于正确的使用约定上的。首先,requireAuth()是通过比较POST信息中的认证key和用户Session中的认证key来实现校验的。所以,Security Component必须被包含在接受请求的Controller中和发起请求的Controller中。

举个例子,如果在PostsController中有一个action要提交数据到CommentsController中的action,首先,Security Component必须被包含在两个controller中,分别为接受请求的CommentsController和发出请求的PostsController。

每次Security Component被加载时,甚至于并没有真正被使用,也同样会执行下列操作:首先,它使用核心Security类生成一个认证key。然后,将生成的key、失效时间和一些附加信息置入session中(失效时间是在/app/config/core.PHP配置的)。再者将key置入你的controller中已备后用。

在视图(view)文件中,任何使用$HTML->formTag()生成的form tag都会包含一个hidden字段用来保存认证key。当form被提交的时候,Security Component可以将之和Session中的认证key进行比对。一旦比对完成,就会重新生成新的认证key供下次使用。