**[权限控制] 利用CI钩子实现权限认证
2015-04-10 16:13
246 查看
http://codeigniter.org.cn/forums/thread-10877-1-1.html
一直没找到CI的权限认证扩展,以前好像找到过一个老外的扩展,不过不怎么好用,现在记不清了,后来仿着jsp firter的方式用CI钩子写了一下,感觉还可以,做个小网站,小应用足够了,没必要搞得太复杂。看到很多人在网上问,这里把我们的方法分享一下,如果你有更好的实现,也请记得分享给我们。^_^
[align=left]通常我们后台路径看起来都会像下面这样:[/align]
[align=left]http://www.php-chongqing.com/index.php/manage/[/align]
[align=left]http://www.php-chongqing.com/index.php/manage/article/add[/align]
[align=left]http://www.php-chongqing.com/index.php/manage/product/delete/1[/align]
[align=left]http://www.php-chongqing.com/index.php/manage/user[/align]
[align=left]因为CI是MVC的,单一入口,并且给我们提供了7个挂钩点,一切就很简单了,我们只需要在CI执行目标控制器方法之前拦截到请求,检查URI是否是以manage开头即可,如果URI以manage开头,就检查用户权限,没有权限就跳转到登陆页或是相关的提示页。[/align]
[align=left]1、先到config/config.php中设置允许使用钩子[/align]
$config['enable_hooks'] = TRUE;
[align=left]2、再到config/hooks.php中配置权限认证钩子[/align]
$hook['post_controller_constructor'] = array( 'class' => 'ManageAuth', 'function' => 'auth', 'filename' =>'ManageAuth.php', 'filepath' => 'hooks');
[align=left]需要注意的是一定要使用'post_controller_constructor'挂钩点,因为我们可能要在ManageAuth中使用CI的aip,连接数据库等。[/align]
[align=left]3、创建ManageAuth.php文件,放到hooks目录下,ManageAuth.php中的代码如下:[/align]
[align=left]OK,就这样,搞定了,我们通过正则表达匹配,凡是以manage打头的url都是需要登陆后才能访问的。[/align]
[align=left]示例中的权限认证很简单,仅仅只是检查下session是否存有username,如果有就认为用户已登陆,可以访问资源,否则就跳转到登陆页面。注意登陆的url千万不是能以manage开头,否则就重向定死循环了。[/align]
[align=left]如果,你须更复杂的权限认证直接写你自己的认证方法就OK了,比如你使用了用户、角色、资源等等。[/align]
[align=left]这种实现基本可以算作AOP(面向切面编程)了,其实PHP已经有了AOP的雏形,改天用原生PHP的方法拦截,实现一下权限认证。^_^[/align]
一直没找到CI的权限认证扩展,以前好像找到过一个老外的扩展,不过不怎么好用,现在记不清了,后来仿着jsp firter的方式用CI钩子写了一下,感觉还可以,做个小网站,小应用足够了,没必要搞得太复杂。看到很多人在网上问,这里把我们的方法分享一下,如果你有更好的实现,也请记得分享给我们。^_^
[align=left]通常我们后台路径看起来都会像下面这样:[/align]
[align=left]http://www.php-chongqing.com/index.php/manage/[/align]
[align=left]http://www.php-chongqing.com/index.php/manage/article/add[/align]
[align=left]http://www.php-chongqing.com/index.php/manage/product/delete/1[/align]
[align=left]http://www.php-chongqing.com/index.php/manage/user[/align]
[align=left]因为CI是MVC的,单一入口,并且给我们提供了7个挂钩点,一切就很简单了,我们只需要在CI执行目标控制器方法之前拦截到请求,检查URI是否是以manage开头即可,如果URI以manage开头,就检查用户权限,没有权限就跳转到登陆页或是相关的提示页。[/align]
[align=left]1、先到config/config.php中设置允许使用钩子[/align]
$config['enable_hooks'] = TRUE;
[align=left]2、再到config/hooks.php中配置权限认证钩子[/align]
$hook['post_controller_constructor'] = array( 'class' => 'ManageAuth', 'function' => 'auth', 'filename' =>'ManageAuth.php', 'filepath' => 'hooks');
[align=left]需要注意的是一定要使用'post_controller_constructor'挂钩点,因为我们可能要在ManageAuth中使用CI的aip,连接数据库等。[/align]
[align=left]3、创建ManageAuth.php文件,放到hooks目录下,ManageAuth.php中的代码如下:[/align]
/** 后台权限拦截钩子 * @link http://www.php-chongqing.com * @author bing.peng * */ class ManageAuth { private $CI; public function __construct() { $this->CI = &get_instance(); } //权限认证 public function auth() { $this->CI->load->helper('url'); if ( preg_match("/manage.*/i", uri_string()) ) { // 需要进行权限检查的URL $this->CI->load->library('session'); if( !$this->CI->session->userdata('username') ) { // 用户未登陆 redirect('login'); return; } } } }
[align=left]OK,就这样,搞定了,我们通过正则表达匹配,凡是以manage打头的url都是需要登陆后才能访问的。[/align]
[align=left]示例中的权限认证很简单,仅仅只是检查下session是否存有username,如果有就认为用户已登陆,可以访问资源,否则就跳转到登陆页面。注意登陆的url千万不是能以manage开头,否则就重向定死循环了。[/align]
[align=left]如果,你须更复杂的权限认证直接写你自己的认证方法就OK了,比如你使用了用户、角色、资源等等。[/align]
[align=left]这种实现基本可以算作AOP(面向切面编程)了,其实PHP已经有了AOP的雏形,改天用原生PHP的方法拦截,实现一下权限认证。^_^[/align]
相关文章推荐
- 利用CI钩子实现权限认证 session
- PHP之运用CI用钩子实现URL权限控制
- PHP之运用CI用钩子实现URL权限控制————————【Badboy】
- PHP之运用CI用钩子实现URL权限控制
- PHP之运用CI用钩子实现URL权限控制————————【Badboy】
- Delphi利用TActionList实现权限控制
- CI框架中通过hook的方式实现简单的权限控制
- 利用shiro实现权限的动态控制
- struts2利用异常处理实现权限控制的两种方法
- 利用基于@AspectJ的AOP实现权限控制
- Spring Cloud与微服务学习总结(4)——认证鉴权与API权限控制在微服务架构中的设计与实现(二)
- 利用struts2拦截器加自定义注解实现权限控制
- 【总结】基于Spring LDAP和Spring Security的用户认证和权限控制Web实现
- 基于Hadoop SLA认证机制实现权限控制
- 认证鉴权与API权限控制在微服务架构中的设计与实现(二)
- Spring Cloud与微服务学习总结(5)——认证鉴权与API权限控制在微服务架构中的设计与实现(三)
- JAVAWEB开发之Servlet3.0新特性的使用以及注解的详细使用和自定义注解的方法、动态代理的使用、利用动态代理实现细粒度的权限控制以及类加载和泛型反射
- 在Access中利用Jquery技术实现专业的界面和权限控制的通用程序
- CI中利用hook实现用户权限访问
- 认证鉴权与API权限控制在微服务架构中的设计与实现(三)