source: trunk/grails-app/controllers/PersonController.groovy @ 149

Last change on this file since 149 was 149, checked in by gav, 10 years ago

Refactor bootstrap data generation to new CreateDataService?.
Tweak security annotations so that ROLE_AppAdmin gives access to all areas.
Rework DataSource? to allow building of prod and dev WARs.
Include MySQL jdbc connector which is GNU GPL'd and used in the prod WAR.

File size: 5.4 KB
Line 
1import org.codehaus.groovy.grails.plugins.springsecurity.Secured
2
3@Secured(['ROLE_Manager','ROLE_AppAdmin'])
4class PersonController extends BaseAppAdminController {
5
6    def authenticateService
7    def filterService
8
9        // the delete, save and update actions only accept POST requests
10        static Map allowedMethods = [delete: 'POST', save: 'POST', update: 'POST']
11
12        def index = {
13                redirect action: list, params: params
14        }
15
16    def list = {
17        params.max = Math.min( params.max ? params.max.toInteger() : 10,  100 )
18
19        if(!params.filter)
20        { return [personList: Person.list(params), personTotal: Person.count()] }
21
22        // filterPane:
23        return[ personList: filterService.filter( params, Person ),
24            personTotal: filterService.count( params, Person ),
25            filterParams: com.zeddware.grails.plugins.filterpane.FilterUtils.extractFilterParams(params),
26            params:params ]
27    }
28
29        def show = {
30
31        // In the case of an actionSubmit button, rewrite action name from 'index'.
32        if(params._action_Show)
33        { params.action='show' }
34
35                def person = Person.get(params.id)
36                if (!person) {
37                        flash.message = "Person not found with id $params.id"
38                        redirect action: list
39                        return
40                }
41                List roleNames = []
42                for (role in person.authorities) {
43                        roleNames << role.authority
44                }
45                roleNames.sort { n1, n2 ->
46                        n1 <=> n2
47                }
48                [person: person, roleNames: roleNames]
49        }
50
51        /**
52         * Person delete action. Before removing an existing person,
53         * they should be removed from those authorities which they are involved.
54         */
55        def delete = {
56
57                def person = Person.get(params.id)
58                if (person) {
59                        def authPrincipal = authenticateService.principal()
60                        // Avoid self-delete.
61                        if (!(authPrincipal instanceof String) && authPrincipal.username == person.loginName) {
62                                flash.message = "You cannot delete yourself, please login as another manager and try again."
63                redirect(action:show,id:params.id)
64                        }
65                        else {
66                                //first, delete this person from Persons_Authorities table.
67                                Authority.findAll().each { it.removeFromPersons(person) }
68                person.isActive = false
69                person.save(flush: true)
70
71                try {
72                    person.delete(flush: true)
73                    flash.message = "Person $params.id deleted."
74                    redirect(action:list)
75                }
76                catch(org.springframework.dao.DataIntegrityViolationException e) {
77                    flash.message = "Could not delete '$person.loginName' due to database constraints, but all authorities have been removed."
78                    redirect(action:show,id:params.id)
79                }
80                        }
81                }
82                else {
83                        flash.message = "Person not found with id $params.id"
84                }
85        }
86
87        def edit = {
88
89        // In the case of an actionSubmit button, rewrite action name from 'index'.
90        if(params._action_Edit)
91        { params.action='edit' }
92
93                def person = Person.get(params.id)
94                if (!person) {
95                        flash.message = "Person not found with id $params.id"
96                        redirect action: list
97                        return
98                }
99        flash.message = "To allow login at least the 'ROLE_AppUser' authority must be given."
100                return buildPersonModel(person)
101        }
102
103        /**
104         * Person update action.
105         */
106        def update = {
107
108                def person = Person.get(params.id)
109                if (!person) {
110                        flash.message = "Person not found with id $params.id"
111                        redirect action: edit, id: params.id
112                        return
113                }
114
115                long version = params.version.toLong()
116                if (person.version > version) {
117                        person.errors.rejectValue 'version', "person.optimistic.locking.failure",
118                                "Another user has updated this Person while you were editing."
119            render view: 'edit', model: buildPersonModel(person)
120                        return
121                }
122
123                person.properties = params
124
125        if(params.pass == "") {
126            person.pass = "InsertNothingToClearValidation"
127        }
128        else {
129            if (person.validate()) {
130                person.password = authenticateService.encodePassword(params.pass)
131            }
132        }
133
134        if (!person.hasErrors() && person.save()) {
135            Authority.findAll().each { it.removeFromPersons(person) }
136            addRoles(person)
137            flash.message = "Person '$params.id - $params.loginName' updated."
138            redirect action: show, id: person.id
139        }
140        else {
141            render view: 'edit', model: buildPersonModel(person)
142        }
143
144        }
145
146        def create = {
147        flash.message = "To allow login at least the 'ROLE_AppUser' authority must be given."
148                [person: new Person(params), authorityList: Authority.list()]
149        }
150
151        /**
152         * Person save action.
153         */
154        def save = {
155
156                def person = new Person()
157                person.properties = params
158                person.password = authenticateService.encodePassword(params.pass)
159                if (person.save()) {
160                        addRoles(person)
161                        redirect action: show, id: person.id
162                }
163                else {
164                        render view: 'create', model: [authorityList: Authority.list(), person: person]
165                }
166        }
167
168        private void addRoles(person) {
169                for (String key in params.keySet()) {
170                        if (key.contains('ROLE') && 'on' == params.get(key)) {
171                                Authority.findByAuthority(key).addToPersons(person)
172                        }
173                }
174        }
175
176        private Map buildPersonModel(person) {
177
178                List roles = Authority.list()
179                roles.sort { r1, r2 ->
180                        r1.authority <=> r2.authority
181                }
182                Set userRoleNames = []
183                for (role in person.authorities) {
184                        userRoleNames << role.authority
185                }
186                LinkedHashMap<Authority, Boolean> roleMap = [:]
187                for (role in roles) {
188                        roleMap[(role)] = userRoleNames.contains(role.authority)
189                }
190
191                return [person: person, roleMap: roleMap]
192        }
193}
Note: See TracBrowser for help on using the repository browser.