Symfony的Session处理特性对开发者完全掩盖了客户端与服务端的SessionID存储,当然,如果你非要去改Session管理机制的默认行为也不是不可能,高级用户经常这么干。
客户端,Session被Cookies处理(handle)。Symfony的Session Cookie叫做symfony,可以在factories.yml中修改。
all: storage: class: sfSessionStorage param: session_name: 自定义Cookie名字
Symfony的Session基于PHP的Session设置,也就是说如果希望客户端使用URL参数方式取代Cookies,你必须修改php.ini文件的use_trans_sid参数,不建议这么做。
在服务器端,symfony默认使用文件存储用户Session,可以通过修改factories.yml文件承担class参数来使用数据库存储:apps/myapp/config/factories.yml
all: storage: class: sfMySQLSessionStorage param: db_table: SESSION_TABLE_NAME # 存储Session的表 database: DATABASE_CONNECTION # 数据库的名称 Class名称可以是:fMySQLSessionStorage, sfPostgreSQLSessionStorage和sfPDOSessionStorage;后面是首选方式。 Session超时的修改和调整:apps/myapp/config/settings.yml default: .settings: timeout: 1800 #Session超时 单位秒
动作的安全
动作的执行可以被限定在具有一定权限的用户。Symfony为此提供的工作允许创建安全的应用,用户只有在通过认证之后才能防伪应用的某些特性或部分。设置安全的应用需要两步:定义动作需要的安全和使用具有权限的用户登录。
访问限制
在每个动作执行前都会被一个特定的过滤器来检查当前用户是否具有访问的权限,symfony中权限有两个部分组成:
① 安全动作只有被授权用户可以访问
② 凭证允许分组管理权限
通过创建或者修改config目录下的security.yml文件即可简单的完成安全访问限制。在文件中可以设置某个动作或者所有动作是否需要授权。
Apps/myapp/modules/mymodule/config/security.yml
read: is_secure: off # 所有用户都可以请求Read动作 update: is_secure: on # update动作只能有认证的用户访问 delete: is_secure: on # 同update credentials: admin # 具有admin凭证 all: is_secure: off # 无需授权
用户访问一个需要授权的动作将依据用户的权限:
① 用户已登录并且凭证符合则动作能执行
② 如果用户没有登录则转向默认登录动作
③ 如果用户已登录但凭证不符合则会转向默认的安全动作
转向将根据apps/myapp/config/settings.yml文件来决定
all: .actions: login_module: default login_action: login secure_module: default secure_action: secure
授权
为某用户授权:
class myAccountActions extends sfActions { public function executeLogin() { if ($this->getRequestParameter('login') == 'foobar') //判断根据具体需求而定 { $this->getUser()->setAuthenticated(true); //设置用户为已认证 } } public function executeLogout() { $this->getUser()->setAuthenticated(false); //设置用户为未认证 } }
在动作中处理凭证:
class myAccountActions extends sfActions { public function executeDoThingsWithCredentials() { $user = $this->getUser(); // 添加凭证 $user->addCredential('foo'); $user->addCredentials('foo', 'admin'); //添加多个凭证 // 判断是否具有凭证 echo $user->hasCredential('foo'); => true // 判断是否具有多个凭证 echo $user->hasCredential(array('foo', 'admin')); => true // Check if the user has one of the credentials echo $user->hasCredential(array('foo', 'admin'), false); => true // 删除凭证 $user->removeCredential('foo'); echo $user->hasCredential('foo'); => false // 删除所有凭证 (被用在注销处理过程中) $user->clearCredentials(); echo $user->hasCredential('admin'); => false } }
如果用户具有'admin'凭证,他就可以访问security.yml文件中设定只有admin可以访问的动作。凭证也经常用来在模板中显示授权信息