<ul> <li><?php echo link_to('section1', 'content/section1') ?></li> <li><?php echo link_to('section2', 'content/section2') ?></li> <?php if ($sf_user->hasCredential('section3')): ?> <li><?php echo link_to('section3', 'content/section3') ?></li> <?php endif; ?> </ul>
sfGuardPlugin插件扩展了session类,使得登录与注销的处理变得简单。
复杂的凭证
在security.yml文件中,可以使用AND或者OR来组合各种凭证,这样就可以建立复杂的业务流和用户权限管理系统。例如,CMS系统后台办公自由具有admin凭证用户访问,文章的编辑必须有editor凭证,发布只能有有publisher凭证的用户,代码如下:
editArticle: credentials: [ admin, editor ] # admin 和 editor publishArticle: credentials: [ admin, publisher ] # admin 和 publisher userManagement: credentials: [[ admin, superuser ]] # admin 或者 superuser
每次添加新的[],凭证之间的关系在AND和OR之间切换,这样可以创建及其复杂的凭证组合关系:
credentials: [[root, [supplier, [owner, quasiowner]], accounts]] # root 或者 (supplier 和 (owner 或者 quasiowner)) 或者 accounts
注:【和】所有凭证都满足,【或】满足其中的一个凭证。
验证和错误处理方法
验证输入是重复且单调的事情,symfony提供了内置的请求验证系统,使用动作类的方法。
看个例子,当一个用户请求myAction,symfony首先去查找validateMyAction()方法,如果找到了就执行,根据返回结果来决定如何往下走:如果返回真则executeMyAction()被执行,否则handleErrorMyAction()被执行,并且,如果找不到handleErrorMyAction,symfony则去查找普通handleError方法,如果还不存在则简单返回sfView::ERROR并递交myActionError.php模板,看下图:
说明:
① validateActionName是验证方法,是ActionName被请求的第一个查找方法,如果不存在则直接执行动作方法。
② handleErrorActionName方法,如果验证失败则查找此方法,如果不存在则Error模板被显示
③ executeActionName是动作方法,对于动作他必须存在。
看段代码:
class mymoduleActions extends sfActions { public function validateMyAction() { return ($this->getRequestParameter('id') > 0); } public function handleErrorMyAction() { $this->message = "Invalid parameters"; return sfView::SUCCESS; } public function executeMyAction() { $this->message = "The parameters are correct"; } }
可以在验证方法中加入任何代码,但最终只要返回true或者false即可。因为是sfActions类的方法,所以可以访问sfRequest和sfUser对象,这样将对于输入与上下文验证非常有利。
过滤器
安全处理可以被认为是请求到动作执行之前必须经过的一个过滤器。实际上可以在动作执行前(后)设置任意多个的过滤器。
过滤器链
Symfony实际上将请求处理看作是过滤器链。框架收到请求后第一个过滤器(通常是sfRenderingFilter)被执行,在某些时候他调用下一个过滤器,依次下去。当最后一个过滤器(通常是sfExecutionFilter)执行后,前一个过滤器结束,依次返回去知道rending过滤器。
所有的过滤器均继承自sfFilter类并且都包含了execute()方法,此方法之前的代码在动作(action)之前执行,此方法之后的代码在动作之后执行,看一段代码(下一节中要用到,取名myFilter代码):
class myFilter extends sfFilter { public function execute ($filterChain) { // 在动作之前执行的代码 ... // 执行下一个过滤器 $filterChain->execute(); // 在动作之后执行的代码 ... } }
过滤器链在/myapp/config/filters.yml文件中定义:
rendering: ~ web_debug: ~ security: ~ # 在这里插入你自己的过滤器 cache: ~ common: ~ flash: ~ execution: ~
这些声明都没有参数(~在symfony中的意思是null,将采用默认的值),他们都继承自symfony核心定义的参数,symfony为每一个过滤器(除了自定义过滤器)定义了类和参数,他们在$sf_symfony_data_dir/config/filter.yml文件。
自定义过滤器链的方法:
① 设置过滤器的enabled参数为off将禁用过滤器,例如:
Web_debug: enabled: off