设置session有效期两种方法:
1直接通过函数设置,手册上是这样session(array('name'=>'session_id','expire'=>3600));
2就是动态改phpini,这是针对全局的ini_set('sessiongc_maxlifetime',1440);//设置session的有效时间是1440秒
方法很多,灵活运用,例如 1在模板中调用{$Thinksession} 2在标签直接编写php代码来判断$_SESSION 3在模板中写,然后在里面直接编写php代码来判断$_SESSION 4在Action中将$_SESSION变量通过assign()方法赋值给模板 5在自定义函数库中
登陆之后 我们取得了用户的一权限。然后就进行验证
//检查当前 *** 作是否需要认证
static function checkAccess()
{
//如果项目要求认证,并且当前模块需要认证,则进行权限认证
if( C('USER_AUTH_ON') ){
$_module = array();
$_action = array();
if("" != C('REQUIRE_AUTH_MODULE')) {
//需要认证的模块
$_module['yes'] = explode(',',strtoupper(C('REQUIRE_AUTH_MODULE')));
}else {
//无需认证的模块
$_module['no'] = explode(',',strtoupper(C('NOT_AUTH_MODULE')));
}
//检查当前模块是否需要认证in_array 查找A是否存在B数组中
if((!empty($_module['no']) && !in_array(strtoupper(MODULE_NAME),$_module['no'])) || (!empty($_module['yes']) && in_array(strtoupper(MODULE_NAME),$_module['yes']))) {
if("" != C('REQUIRE_AUTH_ACTION')) {
//需要认证的 *** 作
$_action['yes'] = explode(',',strtoupper(C('REQUIRE_AUTH_ACTION')));
}else {
//无需认证的 *** 作
$_action['no'] = explode(',',strtoupper(C('NOT_AUTH_ACTION')));
}
//检查当前 *** 作是否需要认证
if((!empty($_action['no']) && !in_array(strtoupper(ACTION_NAME),$_action['no'])) || (!empty($_action['yes']) && in_array(strtoupper(ACTION_NAME),$_action['yes']))) {
return true;
}else {
return false;
}
}else {
return false;
}
}
return false;
}
//权限认证的过滤器方法 //默认为当前模块 所以要放在头部
static public function AccessDecision($appName=APP_NAME)
{
//检查是否需要认证
if(RBAC::checkAccess()) {
//存在认证识别号,则进行进一步的访问决策
$accessGuid = md5($appNameMODULE_NAMEACTION_NAME);
if(empty($_SESSION[C('ADMIN_AUTH_KEY')])) {
if(C('USER_AUTH_TYPE')==2) {
//加强验证和即时验证模式 更加安全 后台权限修改可以即时生效
//通过数据库进行访问检查
$accessList = RBAC::getAccessList($_SESSION[C('USER_AUTH_KEY')]);//获取权限
}else {
// 如果是管理员或者当前 *** 作已经认证过,无需再次认证
if( $_SESSION[$accessGuid]) {
return true;
}
//登录验证模式,比较登录后保存的权限访问列表
$accessList = $_SESSION['_ACCESS_LIST'];
}
//判断是否为组件化模式,如果是,验证其全模块名
$module = defined('P_MODULE_NAME') P_MODULE_NAME : MODULE_NAME;
if(!isset($accessList[strtoupper($appName)][strtoupper($module)][strtoupper(ACTION_NAME)])) {
$_SESSION[$accessGuid] = false;
return false;
}
else {
$_SESSION[$accessGuid] = true;
}
}else{
//管理员无需认证
return true;
}
}
return true;
}
这两个差别可就大了
session是结合本地cookie使用的,一般用做登录或验证码使用,当然也可以临时存储一些变量,但数量不能太多;
S在tp是缓存,而且这个缓存是仅在服务器上的,常用在一些不适合频繁调用的地方,比如微信开发时候获取access_token,而获取access_token微信有很严格的调用次数限制,这时候缓存就能起到很重要的作用,用到的时候直接读缓存就可以,同时也大大提升了响应速度。
CAS是CentralAuthenticationService的缩写,中央认证服务,一种独立开放指令协议。
CAS是 Yale 大学发起的一个开源项目,旨在为Web应用系统提供一种可靠的单点登录方法,CAS在2004年12月正式成为JA-SIG的一个项目。
特点
1、开源的企业级单点登录解决方案。
2、CASServer为需要独立部署的Web应用。
3、CASClient支持非常多的客户端(这里指单点登录系统中的各个Web应用),包括Java,Net,PHP,Perl,Apache,uPortal,Ruby等。
原理和协议
从结构上看,CAS包含两个部分:CASServer和CASClient。CASServer需要独立部署,主要负责对用户的认证工作;
CASClient负责处理对客户端受保护资源的访问请求,需要登录时,重定向到CASServer。图是CAS最基本的协议过程:
CASClient与受保护的客户端应用部署在一起,以Filter方式保护受保护的资源。对于访问受保护资源的每个Web请求,CASClient会分析该请求的>
如果没有,则说明当前用户尚未登录,于是将请求重定向到指定好的CASServer登录地址,并传递Service(也就是要访问的目的资源地址),以便登录成功过后转回该地址。
用户在第3步中输入认证信息,如果登录成功,CASServer随机产生一个相当长度、唯一、不可伪造的ServiceTicket,并缓存以待将来验证,
之后系统自动重定向到Service所在地址,并为客户端浏览器设置一个TicketGrantedCookie(TGC),
CASClient在拿到Service和新产生的Ticket过后,在第5,6步中与CASServer进行身份核实,以确保ServiceTicket的合法性。
在该协议中,所有与CAS的交互均采用SSL协议,确保,ST和TGC的安全性。协议工作过程中会有2次重定向的过程,但是CASClient与CASServer之间进行Ticket验证的过程对于用户是透明的。
另外,CAS协议中还提供了Proxy(代理)模式,以适应更加高级、复杂的应用场景,具体介绍可以参考CAS官方网站上的相关文档。
扩展资料
使用CAS在Tomcat中实现单点登录中部署客户端应用
单点登录的目的是为了让多个相关联的应用使用相同的登录过程,本文在讲解过程中构造2个简单的应用,分别以casTest1和casTest2来作为示例,它们均只有一个页面,显示欢迎信息和当前登录用户名。
这2个应用使用同一套登录信息,并且只有登录过的用户才能访问,通过本文的配置,实现单点登录,即只需登录一次就可以访问这两个应用。
与CASServer建立信任关系
假设CASServer单独部署在一台机器A,而客户端应用部署在机器B上,由于客户端应用与CASServer的通信采用SSL,因此,需要在A与B的JRE之间建立信任关系。
首先与A机器一样,要生成B机器上的证书,配置Tomcat的SSL协议。
其次,下载>
并且在接下来出现的询问中输入1。
这样,就将A添加到了B的truststore中。如果多个客户端应用分别部署在不同机器上,那么每个机器都需要与CASServer所在机器建立信任关系。
配置CASFilter
准备好应用casTest1和casTest2过后,分别部署在B和C机器上,由于casTest1和casTest2,B和C完全等同,我们以casTest1在B机器上的配置做介绍,
假设A和B的域名分别为domainA和domainB。
将cas-client-java-211zip改名为cas-client-java-211jar并拷贝到casTest1/WEB-INF/lib目录下,修改webxml文件,添加CASFilter,如清单10所示:
清单10添加CASFilter
<web-app> <filter><filter-name>CASFilter</filter-name>
<filter-class>eduyaleitstpcasclientfilterCASFilter</filter-class><init-param>
<param-name>eduyaleitstpcasclientfilterloginUrl</param-name><param-value>>
<param-name>eduyaleitstpcasclientfiltervalidateUrl</param-name>
<param-value>><filter-name>CASFilter</filter-name>
<url-pattern>/protected-pattern/</url-pattern></filter-mapping>
</web-app>
对于所有访问满足casTest1/protected-pattern/路径的资源时,都要求到CASServer登录,如果需要整个casTest1均受保护,可以将url-pattern指定为“/”。
从清单10可以看到,我们可以为CASFilter指定一些参数,并且有些是必须的,表格1 和表格2 中分别是必需和可选的参数:
表格1CASFilter必需的参数
表格2CASFilter可选参数
传递登录用户名
CAS在登录成功过后,会给浏览器回传Cookie,设置新的到的ServiceTicket。但客户端应用拥有各自的Session,我们要怎么在各个应用中获取当前登录用户的用户名呢?
CASClient的Filter已经做好了处理,在登录成功后,就可以直接从Session的属性中获取,如清单11所示:
清单11在Java中通过Session获取登录用户名
1 //以下两者都可以
2 sessiongetAttribute(CASFilterCAS_FILTER_USER);
3 sessiongetAttribute("eduyaleitstpcasclientfilteruser");
在JSTL中获取用户名的方法如清单12所示:
清单12通过JSTL获取登录用户名
1 <c:outvalue="${sessionScope[CAS:'eduyaleitstpcasclientfilteruser']}"/>
另外,CAS提供了一个CASFilterRequestWrapper类,该类继承自>
只要在前面配置CASFilter的时候为其设置“eduyaleitstpcasclientfilterwrapRequest”参数为true,就可以通过getRemoteUser()方法来获取登录用户名,具体方法如清单13所示:
清单13通过CASFilterRequestWrapper获取登录用户名
1 CASFilterRequestWrapper reqWrapper=newCASFilterRequestWrapper(request);2 outprintln("Thelogonuser:"+reqWrappergetRemoteUser());
参考资料来源:百度百科-CAS
参考资料来源:IBM中国-使用CAS在Tomcat中实现单点登录
以上就是关于tp框架里session默认是多久过期配置什么无效果,php.ini文件session.gc_maxlifetime设置也无效,全部的内容,包括:tp框架里session默认是多久过期配置什么无效果,php.ini文件session.gc_maxlifetime设置也无效,、TP框架模板里写三元运算符以session判断该怎么写,比如{$Think.session.xx'xxx':'xxx'}这样写是错的、求助,TP框架下RBAC获取权限问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)