Acl.class.php
4.67 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
<?php
/**
* 权限验证插件,该插件于boot.php配置文件中注册
*
* @version 0.1 20012-7-25
* @author xiaoma
* @name Lib_Plugs_Acl
*/
class Lib_Plugin_Acl extends Framework_YPlugin
{
/**
* 当前登录用户
*
* @var unknown_type
*/
private $_uid ;
/**
* 初始化函数(仅在初始化时调用 ,两次调用则只会在第一次有效,相当于构造函数)
*
* @var Lib_Plugs_Acl
*/
public function init()
{
}
/**
* 执行事件之前操作(每次执行 插件都会操作)
*
*/
protected function before_execute()
{
}
/**
* 执行插件结束时调用 (每次执行 插件都会调用)
*
*/
protected function after_execute()
{
}
/**
* 安装插件
*
*/
public function _install()
{
}
/**
* 卸载插件
*
*/
public function _uninstall()
{
}
/**
* 执行控制器动作之前(事件主体)
*
*/
public function beforeDispatch()
{
//检测是否允许访问
if ($this->canAccess() === false)
{
//上下文请求对象
$request = Framework_YHttpRequest::instance();
//如果是ajax请求,返回相应格式
if ($request->isAjax())
{
//这里可以return json
$json = array(
'status' => false,
'code' => Config_Code::$error_auth['code'],
'message' => Config_Code::$error_auth['message'],
'data' => Config_Code::$error_auth['message'],
);
return json_encode($json);
}
//如果非ajax请求,这里可以转到到登录页面
//组装参数
$args = array(
'message' => Config_Code::$error_auth['message'],
'refer_url' => $request->requestUri(),
);
//页面转发至登录的页面
return new Framework_Response_YForward('passport::signin',$args);
}
}
/**
* 获取需要登录才能访问的的名单
*
* @version 0.1 20012-7-25
* @author xiaoma
* @return array
*/
public function getNeedRole()
{
//@FIXME 返回需要登录才能访问的列表,该地方可以采用配置文件的方式引进,需放入缓存
$config_file = C('APP.Config_Dir').DS.'Access.inc.php' ;
$list = include $config_file;
return $list ;
}
/**
* 判断是否有访问的权限
*
* @version 0.1 20012-7-25
* @author xiaoma
* @return boolean
*/
private function canAccess()
{
$request = Framework_YHttpRequest::instance();
$url = $request->requestUDI();
$canAccess = false ;
if ($url['module'] == 'admin')
{
//@todo 后台权限权限
$canAccess = $this->checkBackstage();
}else
{
//@todo 前台权限控制
$canAccess = $this->checkFront();
}
return $canAccess ;
}
/**
* 检测是否有权限访问后台
*
* @return boolean
*/
private function checkBackstage()
{
return true ;
}
/**
* 检测是否有权限访问前台
*
* @return boolean
*/
private function checkFront()
{
//如果已经登录,直接返回,允许其访问 ^_^
if ($this->_uid)
{
return true;
}
$request = Framework_YHttpRequest::instance();
$url = $request->requestUDI();
//获取需要登录的名单
$canAccess = $this->getNeedRole() ;
//组装相应的格式
$format1 = $url['namespace'].'::*/*@'.$url['module'];
$format2 = $url['namespace'].'::'.$url['controller'].'/*@'.$url['module'];
$format3 = $url['namespace'].'::'.$url['controller'].'/'.$url['action'].'@'.$url['module'];
//校验是否存在于名单中,如存在,说明需要登录才可以访问,就返回false
$allow = true ; //默认有权访问
do {
if (isset($canAccess[$format3]))
{
$allow = !$canAccess[$format3] ;
break ;
}
if (isset($canAccess[$format2]) )
{
$allow = !$canAccess[$format2] ;
break ;
}
if (isset($canAccess[$format1]))
{
$allow = !$canAccess[$format1] ;
break ;
}
}while (false);
return $allow ;
}
/**
* 完成视图渲染后
*
* @param mixed $response 输出到网页的内容
*/
public function afterRender($response)
{
}
}
?>