Symfony2 Security in Depth: Authentication

基本上每一个系统的安全控制都会分为认证和授权两部分。认证就是确认使用系统的这个人的身份,授权就是判断这个人是否有权利执行某个操作。
Symfony2框架提供了挺复杂的一套安全控制机制,具体实现位于symfony代码目录下的src/Symfony/Component/Securitysrc/Symfony/Bundle/SecurityBundle,在SecurityBundle里通过Symfony2的依赖注入机制将整个安全框架组装起来,而Component里的代码就是组装起这个安全框架的零件。
对这个安全框架的所有控制都是以symfony的security.yml配置文件为入口的(可以执行php app\console config:dump-reference security看到所有可用的配置项)。其中负责用户认证的部分为:encoders,providers,firewalls。下面先描述一下symfony处理一个请求的过程中,security是怎么起作用的,然后再详细介绍着三个部分的配置和如何根据自己的需要调整认证过程的逻辑。


  1. Symfony收到请求,在请求处理触发onKernelRequest事件时,有个FirewallListener监听器(在SecurityBundle中注册),这个事件处理的代码就是整个安全控制系统的入口。

  2. 在Firewall::onKernalRequest()方法里,通过注入的一个FirewallMap对象,找出当前请求的URI上配置了哪些AuthenticateListener,然后逐个调用这些Listener对象的handler($event)方法

  3. 这些Listener都是依赖注入容器里的对象,在handle($event)方法里可以利用它们可用的资源做它们想做的事情,但是如果某个Listener里面对传入的$event对象调用了$event->setResponse($response)方法,那么整个请求处理就结束了,这个$response对象会返回给浏览器。


其实整个验证和授权都是在这个过程中完成,其中所有的控制逻辑就都在那些AuthenticateListener的handle($event)里了(https://github.com/symfony/symfony/tree/master/src/Symfony/Component/Security/Http/Firewall)。

阅读全文

多版本Python环境:virtualenv

工作中要和大量的CentOS 5.x打交道,里面的Python的版本还是古老的2.4,升级又比较困难(个人能力问题,没成功过,典型的问题就是yum没法用了)。后来发现了virtualenv可以完美的处理这个问题。可以在系统里同时使用任意个版本的python。
第一步还是用系统里现有的python装上virtualenv:easy_install virtualenv (没有easy_install的话先用包管理工具安装一下python_setuptool)。
第二步是在一个自己选择的位置安装一个需要的python,可以下载现成的python二进制包,或者下载源码自己编译,设置--prefix指定安...

阅读全文

PHP项目自动化部署实践

之前写过一篇使用Phing进行自动化部署的文章,主要是介绍了如何配置Phing来实现自动部署代码的功能。这篇文章是要总结一下项目自动部署相关的一些实践经验。
项目的版本控制,其实不只是程序的代码,任何和程序正常执行相关的数据都应该在版本控制之中,下面列举一些需要和项目放在一起管理的配置信息:
1. nginx或apache配置
Web服务器的配置很多时候也会包含一些项目所依赖的程序逻辑 ,比如url重写,不同目录的映射之类的配置,这些信息应该作为项目的一部分,放在一个配置文件里,包含在项目版本库里。nginx和apache都支持配置文件的包含,项目的配置文件需要被包含进web服务器的配置文件里,部署...

阅读全文

PHP的革命者——Composer

http://getcomposer.org/
虽然自从毕业开始就被PHP养活了多年,但我一直不喜欢这个语言,相比Java、python,ruby,PHP就是一团糟,代码没有规范,项目没有规范,Pear的包管理功能如同shit一般,数不清的框架各自占着各自的山头,而且似乎每个人还在盘算着写自己的框架,各种社区充斥着各种幼稚而蛮横且无意义的争论,每个人都自命不凡,别人看起来都是白痴......
但今年出现的一些东西让PHP的未来值得期待了。我感觉PHP最重要的一个变化是有了Composer,一个现代化的包管理工具,更重要的是不少人接受了这个先进的东西。一个包管理工具能影响一个语言?是的,这个工具代表...

阅读全文

PHP5.4性能测试

看了鸟哥介绍了PHP5.4里的各项性能优化改进,里面提到Symfony在5.4里没什么进步,感觉有点儿意外,就自己测试了一组PHP框架在5.4和5.3之间的性能差别。
测试方式没啥技术含量, 就是每个框架都用最简单的方式输出个HelloWorld,用ab测试每秒相应数。选择的框架包括:Symfony2, CodeIgnitor, Yii, Kohana, Solar, Silex, Laravel, FuelPHP。都是官网下载的最新稳定版。另外还测试了<?php echo "HELLO WORLD"; ?>作为参考。
结果是每个框架都快了50%以上,而echo只快了不到5%。看起来5.4的改进让...

阅读全文

PHP的OAuth Provider实现

最近做了个oauth的认证服务,用的是pecl的oauth扩展实现的。PHP的OAuth Provider的文档比较稀少,只要自己慢慢摸索了。先把OAuth1.0a的协议看了一遍http://tools.ietf.org/html/rfc5849,对比着OAuthProvider的一个个方法猜测是干什么用的。还自己用node.js实现了一个(由于时间比较紧,没空调试了,还是用了PHP的)。
其实PHP的OAuthProvider扩展主要实现了获取参数和验证签名的功能,oauth里也就签名是比较复杂的一部分内容。OAuthProvider要验证一个请求是否有效,1需要知道这个请求来源的Consum...

阅读全文

NodeJS实现的IP归属地查询

代码放在gist上: https://gist.github.com/2966988
使用的时候只需要执行:node ipquery.js (需要几秒的时间加载IP数据,构造IP查询的数据结构)
这个程序在8421端口提供一个memcache协议的接口,memcache.get('123.23.23.23')返回的就是这个ip的归属地信息。另外在8420端口提供了一个http的服务接口,请求http://localhsot:8420/?123.123.123.123 返回的就是这个地址对应的地区信息。
主要查询逻辑是在ip_mapping.js文件中,另外test.js文件里还用vows写了点儿简单...

阅读全文

搭建自己的Git仓库——RhodeCode

UPDATE: There's another great option: gitlab

http://www.python-blog.com/
Git在开源世界里越来越流行了,github确实是把协作开发的功能做到了极致,让每个人都可以毫无障碍的参与到感兴趣的开源项目之中,让开源项目真正的对所有人开放了。
自己也一直想搭建一个团队内部的git仓库,缺找不到一个像redmine那样的方便的开源软件来实现。前几天在HackerNews上看到了这个RhodeCode项目,完全就是我要找的,安装配置三四行命令就完成了,提供了git和mercurial的支持,方便的管理用户权限,仓库浏览,代码review,...

阅读全文

Release It! 读书笔记(2)—— Stability Patterns

首先再次推荐一下《Release It!》,下面接着上一篇日志继续这个话题
Pattern 1. Use Timeouts 一定要设置超时
“等待”是大多数系统无法服务的直接原因:不响应的服务,Sync Flood攻击,死锁的IO,太多的并发连接。网络永远是个不可靠因素,设置超时是任何一个涉及到网络的接口需要的参数,而且要设置一个合理的值,太长等于没有,太短会造成很多不必要的错误。
Pattern 2. Circuit Breaker
小时候听大人说了不少农村刚通上电的时候很多中电的惨案,而现在已经鲜有触电身亡的人了,我还被220V AC点到过两次,所幸有断路器的保护,没有造成任何伤害。软件系统设计里...

阅读全文

Release It! 读书笔记(1)—— Stability Anti-patterns

Design and Deploy Production-Ready Software
Production ready了是个很高的标准,相对于功能的完整,就像是拿Nokia和山寨机对比。生产级别的系统的要求很简单——稳定,但简单和容易可不是同义词。这本书首先传达的一个观念就是,任何系统都是不可靠的,而达到稳定目标的途径就是通过处理好各种不稳定因素。而这本书介绍的就是有那些不稳定的因素和各种模式和反模式。
第一部分的主题是Stability。首先用作者经历过的案例介绍了系统崩溃的统一的模式:从小裂缝开始,一旦出现了裂痕,出问题的这个部分承受压力的能力就会减弱,然后裂缝逐渐蔓延,一个组件的损坏会造成...

阅读全文
    • Hybrid Coder