PageRenderTime 43ms CodeModel.GetById 21ms RepoModel.GetById 1ms app.codeStats 0ms

/baser/models/permission.php

https://github.com/hashing/basercms
PHP | 309 lines | 161 code | 31 blank | 117 comment | 21 complexity | 2ab61ce696f532b039c4aabdb10c4f56 MD5 | raw file
Possible License(s): MIT
  1. <?php
  2. /* SVN FILE: $Id$ */
  3. /**
  4. * パーミッションモデル
  5. *
  6. * PHP versions 5
  7. *
  8. * baserCMS : Based Website Development Project <http://basercms.net>
  9. * Copyright 2008 - 2012, baserCMS Users Community <http://sites.google.com/site/baserusers/>
  10. *
  11. * @copyright Copyright 2008 - 2012, baserCMS Users Community
  12. * @link http://basercms.net baserCMS Project
  13. * @package baser.models
  14. * @since baserCMS v 0.1.0
  15. * @version $Revision$
  16. * @modifiedby $LastChangedBy$
  17. * @lastmodified $Date$
  18. * @license http://basercms.net/license/index.html
  19. */
  20. /**
  21. * Include files
  22. */
  23. /**
  24. * パーミッションモデル
  25. *
  26. * @package baser.models
  27. */
  28. class Permission extends AppModel {
  29. /**
  30. * クラス名
  31. *
  32. * @var string
  33. * @access public
  34. */
  35. var $name = 'Permission';
  36. /**
  37. * ビヘイビア
  38. *
  39. * @var array
  40. * @access public
  41. */
  42. var $actsAs = array('BcCache');
  43. /**
  44. * データベース接続
  45. *
  46. * @var string
  47. * @access public
  48. */
  49. var $useDbConfig = 'baser';
  50. /**
  51. * belongsTo
  52. * @var array
  53. * @access public
  54. */
  55. var $belongsTo = array('UserGroup' => array( 'className'=>'UserGroup',
  56. 'foreignKey'=>'user_group_id'));
  57. /**
  58. * permissionsTmp
  59. * ログインしているユーザーの拒否URLリスト
  60. * キャッシュ用
  61. *
  62. * @var mixed
  63. * @access public
  64. */
  65. var $permissionsTmp = -1;
  66. /**
  67. * バリデーション
  68. *
  69. * @var array
  70. * @access public
  71. */
  72. var $validate = array(
  73. 'name' => array(
  74. array( 'rule' => array('notEmpty'),
  75. 'message' => '設定名を入力してください。'),
  76. array( 'rule' => array('maxLength', 255),
  77. 'message' => '設定名は255文字以内で入力してください。')
  78. ),
  79. 'user_group_id' => array(
  80. array( 'rule' => array('notEmpty'),
  81. 'message' => 'ユーザーグループを選択してください。',
  82. 'required' => true)
  83. ),
  84. 'url' => array(
  85. array( 'rule' => array('notEmpty'),
  86. 'message' => '設定URLを入力してください。'),
  87. array( 'rule' => array('maxLength', 255),
  88. 'message' => '設定URLは255文字以内で入力してください。'),
  89. array( 'rule' => array('checkUrl'),
  90. 'message' => 'アクセス拒否として設定できるのは認証ページだけです。')
  91. )
  92. );
  93. /**
  94. * 設定をチェックする
  95. *
  96. * @param array $check
  97. * @return boolean True if the operation should continue, false if it should abort
  98. * @access public
  99. */
  100. function checkUrl($check) {
  101. if(!$check[key($check)]) {
  102. return true;
  103. }
  104. $url = $check[key($check)];
  105. if(preg_match('/^[^\/]/is',$url)) {
  106. $url = '/'.$url;
  107. }
  108. // ルーティング設定に合わせて変換
  109. $url = preg_replace('/^\/admin\//', '/'.Configure::read('Routing.admin').'/', $url);
  110. if(preg_match('/^(\/[a-z_]+)\*$/is',$url,$matches)) {
  111. $url = $matches[1].'/'.'*';
  112. }
  113. $params = Router::parse($url);
  114. if(empty($params['prefix'])) {
  115. return false;
  116. }
  117. return true;
  118. }
  119. /**
  120. * 認証プレフィックスを取得する
  121. *
  122. * @param int $id
  123. * @return string
  124. * @access public
  125. */
  126. function getAuthPrefix($id) {
  127. // CSV の場合、他テーブルの fields を指定するとデータが取得できない
  128. $data = $this->find('first', array(
  129. 'conditions'=>array('Permission.id'=>$id),
  130. /*'fields'=>array('UserGroup.auth_prefix'),*/
  131. 'recursive'=>1
  132. ));
  133. if(isset($data['UserGroup']['auth_prefix'])) {
  134. return $data['UserGroup']['auth_prefix'];
  135. } else {
  136. return '';
  137. }
  138. }
  139. /**
  140. * 初期値を取得する
  141. * @return array
  142. * @access public
  143. */
  144. function getDefaultValue() {
  145. $data['Permission']['auth'] = 0;
  146. $data['Permission']['status'] = 1;
  147. return $data;
  148. }
  149. /**
  150. * コントロールソースを取得する
  151. *
  152. * @param string フィールド名
  153. * @return array コントロールソース
  154. * @access public
  155. */
  156. function getControlSource($field = null) {
  157. $controlSources['user_group_id'] = $this->UserGroup->find('list',array('conditions'=>array('UserGroup.id <>'=>1)));
  158. $controlSources['auth'] = array('0'=>'不可','1'=>'可');
  159. if(isset($controlSources[$field])) {
  160. return $controlSources[$field];
  161. }else {
  162. return false;
  163. }
  164. }
  165. /**
  166. * beforeSave
  167. *
  168. * @param array $options
  169. * @return boolean
  170. * @access public
  171. */
  172. function beforeSave($options) {
  173. if(isset($this->data['Permission'])) {
  174. $data = $this->data['Permission'];
  175. }else {
  176. $data = $this->data;
  177. }
  178. if(isset($data['url'])) {
  179. if(preg_match('/^[^\/]/is',$data['url'])) {
  180. $data['url'] = '/'.$data['url'];
  181. }
  182. }
  183. $this->data['Permission'] = $data;
  184. return true;
  185. }
  186. /**
  187. * 権限チェックを行う
  188. *
  189. * @param array $url
  190. * @param string $userGroupId
  191. * @param array $params
  192. * @return boolean
  193. * @access public
  194. */
  195. function check($url, $userGroupId) {
  196. if($this->permissionsTmp === -1) {
  197. $conditions = array('Permission.user_group_id' => $userGroupId);
  198. $permissions = $this->find('all',array('conditions'=>$conditions,'order'=>'sort','recursive'=>-1));
  199. if($permissions) {
  200. $this->permissionsTmp = $permissions;
  201. }else {
  202. $this->permissionsTmp = array();
  203. return true;
  204. }
  205. }
  206. $permissions = $this->permissionsTmp;
  207. if($url!='/') {
  208. $url = preg_replace('/^\//is', '', $url);
  209. }
  210. $adminPrefix = Configure::read('Routing.admin');
  211. $url = preg_replace("/^{$adminPrefix}\//", 'admin/', $url);
  212. // ダッシュボード、ログインユーザーの編集とログアウトは強制的に許可とする
  213. $allows = array(
  214. '/^admin$/',
  215. '/^admin\/$/',
  216. '/^admin\/dashboard\/.*?/',
  217. '/^admin\/users\/edit\/'.$_SESSION['Auth']['User']['id'].'$/',
  218. '/^admin\/users\/logout$/',
  219. '/^admin\/users\/back_agent$/',
  220. '/^admin\/user_groups\/set_default_favorites$/'
  221. );
  222. foreach($allows as $allow) {
  223. if(preg_match($allow, $url)) {
  224. return true;
  225. }
  226. }
  227. $ret = true;
  228. foreach($permissions as $permission) {
  229. if(!$permission['Permission']['status']) {
  230. continue;
  231. }
  232. if($permission['Permission']['url']!='/') {
  233. $pattern = preg_replace('/^\//is', '', $permission['Permission']['url']);
  234. }else {
  235. $pattern = $permission['Permission']['url'];
  236. }
  237. $pattern = addslashes($pattern);
  238. $pattern = str_replace('/', '\/', $pattern);
  239. $pattern = str_replace('*', '.*?', $pattern);
  240. $pattern = '/^'.str_replace('\/.*?', '(|\/.*?)', $pattern).'$/is';
  241. //var_dump($pattern);
  242. if(preg_match($pattern, $url)) {
  243. $ret = $permission['Permission']['auth'];
  244. }
  245. }
  246. return $ret;
  247. }
  248. /**
  249. * アクセス制限データをコピーする
  250. *
  251. * @param int $id
  252. * @param array $data
  253. * @return mixed UserGroup Or false
  254. */
  255. function copy($id, $data = array()) {
  256. if($id) {
  257. $data = $this->find('first', array('conditions' => array('Permission.id' => $id), 'recursive' => -1));
  258. }
  259. if($this->find('count', array('conditions' => array('Permission.user_group_id' => $data['Permission']['user_group_id'], 'Permission.name' => $data['Permission']['name'])))) {
  260. $data['Permission']['name'] .= '_copy';
  261. return $this->copy(null, $data); // 再帰処理
  262. }
  263. unset($data['Permission']['id']);
  264. unset($data['Permission']['modified']);
  265. unset($data['Permission']['created']);
  266. $data['Permission']['no'] = $this->getMax('no',array('user_group_id' => $data['Permission']['user_group_id']))+1;
  267. $data['Permission']['sort'] = $this->getMax('sort',array('user_group_id' => $data['Permission']['user_group_id']))+1;
  268. $this->create($data);
  269. $result = $this->save();
  270. if($result) {
  271. $result['Permission']['id'] = $this->getInsertID();
  272. return $result;
  273. } else {
  274. return false;
  275. }
  276. }
  277. }
  278. ?>