source: trunk/server/www/app/app_controller.php @ 219

Last change on this file since 219 was 219, checked in by sander, 11 years ago

Point to the new wiki for documentation

File size: 5.2 KB
Line 
1<?php
2
3/**
4 * The global AppController.
5 *
6 * Takes care of authentication for all controllers
7 *
8 * The authentication model comes from Studio Canaria:
9 * http://www.studiocanaria.com/articles/cakephp_auth_component_users_groups_permissions_revisited
10 */
11class AppController extends Controller
12{
13        /**
14         * @var $components array Array of components to load for every controller in the application
15         */
16        public $components = array('AuthCert', 'Session', 'Cookie');
17
18        /**
19         * Application hook which runs prior to each controller action
20         */
21        public function beforeFilter()
22        {
23                //Override default fields used by Auth component
24                $this->AuthCert->fields = array('username'=>'email_address','password'=>'password');
25                //Set application wide actions which do not require authentication
26                $this->AuthCert->allow(array());
27                //Set the default redirect for users who logout
28                $this->AuthCert->logoutRedirect = '/';
29                //Set the default redirect for users who login
30                $this->AuthCert->loginRedirect = '/';
31                //The error displayed when a login error occurs
32                $this->AuthCert->loginError = __('Login failed. Wrong e-mail address or password.', true);
33                //Extend auth component to include authorisation via isAuthorized action
34                $this->AuthCert->authorize = 'controller';
35                //Restrict access to only users with an active account
36                $this->AuthCert->userScope = array('User.active = 1');
37                //Pass auth component data over to view files
38                $this->set('Auth',$this->AuthCert->user());
39        }
40
41        /**
42         * Application hook which runs after each action but, before the view file is
43         * rendered
44         */
45        public function beforeRender()
46        {
47                //If we have an authorised user logged then pass over an array of controllers
48                //to which they have index action permission
49                $permittedControllers = array(
50                        __('Factories', true) => '/factories',
51                );
52
53                if ($this->AuthCert->user()) {
54                        $permittedControllers[__('Requests', true)] = '/requests';
55                        $permittedControllers[__('Your account', true)] = '/users/view';
56                }
57
58                $permittedControllers[__('Manuals', true)] = 'http://code.officeshots.org/trac/officeshots/wiki/Documentation';
59
60                if ($this->__permitted('users', 'admin_index')) {
61                        $permittedControllers[__('Users', true)] = '/admin/users';
62                        $permittedControllers[__('Groups', true)] = '/admin/groups';
63                }
64
65                if (!$this->AuthCert->hasCert) {
66                        if ($this->AuthCert->user()) {
67                                $permittedControllers[__('Logout', true)] = '/users/logout';
68                        } else {
69                                $permittedControllers[__('Login', true)] = '/users/login';
70                        }
71                }
72
73                $this->set('controllers', $permittedControllers);
74        }
75
76        /**
77         * Called by Auth component for establishing whether the current authenticated
78         * user has authorization to access the current controller:action
79         *
80         * @return true if authorised/false if not authorized
81         */
82        public function isAuthorized()
83        {
84                return $this->__permitted($this->name, $this->action);
85        }
86
87        /**
88         * Helper function returns true if the currently authenticated user has permission
89         * to access the controller:action specified by $controllerName:$actionName
90         *
91         * @param $controllerName Object
92         * @param $actionName Object
93         * @return
94         */
95        public function __permitted($controllerName, $actionName)
96        {
97                if (!$user_id = $this->AuthCert->user('id')) {
98                        return false;
99                }
100
101                //Ensure checks are all made lower case
102                $controllerName = low($controllerName);
103                $actionName = low($actionName);
104               
105                //If permissions have not been cached to session...
106                if (!$this->Session->check('Permissions')) {
107                        //...then build permissions array and cache it
108                       
109                        // Set the global permissions for all users that are logged in
110                        $permissions = array(
111                                'users:logout',
112                                'users:index',
113                                'users:view',
114                                'users:edit',
115                                'requests:index',
116                                'requests:view',
117                                'requests:add',
118                                'requests:download',
119                                'results:view',
120                                'results:download',
121                        );
122
123                        //Import the User Model so we can build up the permission cache
124                        App::import('Model', 'User');
125                        $thisUser = new User();
126
127                        //Now bring in the current users full record along with groups
128                        $thisGroups = $thisUser->find(array('User.id' => $user_id));
129                        $thisGroups = $thisGroups['Group'];
130                        foreach ($thisGroups as $thisGroup) {
131                                $thisPermissions = $thisUser->Group->find(array('Group.id' => $thisGroup['id']));
132                                $thisPermissions = $thisPermissions['Permission'];
133                                foreach ($thisPermissions as $thisPermission) {
134                                        $permissions[] = $thisPermission['name'];
135                                }
136                        }
137
138                        //write the permissions array to session
139                        $this->Session->write('Permissions', $permissions);
140                } else {
141                        //...they have been cached already, so retrieve them
142                        $permissions = $this->Session->read('Permissions');
143                }
144
145                //Now iterate through permissions for a positive match
146                foreach ($permissions as $permission) {
147                        if ($permission == '*') {
148                                return true; //Super Admin Bypass Found
149                        }
150                        if ($permission == $controllerName.':*') {
151                                return true; //Controller Wide Bypass Found
152                        }
153                        if ($permission == $controllerName.':'.$actionName) {
154                                return true; //Specific permission found
155                        }
156                }
157                return false;
158        }
159
160        /**
161         * Set the language based on the session or a cookie
162         */
163        private function __setLanguage()
164        {
165                if ($this->Cookie->read('lang') && !$this->Session->check('Config.language')) {
166                        $this->Session->write('Config.language', $this->Cookie->read('lang'));
167                }
168        }
169}
170
171?>
Note: See TracBrowser for help on using the repository browser.