PageRenderTime 84ms CodeModel.GetById 40ms app.highlight 25ms RepoModel.GetById 16ms app.codeStats 0ms

/grails-app/controllers/general/UsuarioController.groovy

http://github.com/jdmr/mateo
Groovy | 250 lines | 221 code | 26 blank | 3 comment | 50 complexity | 65ae407cd4cd9f4e6998bbaadc32a461 MD5 | raw file
  1package general
  2
  3import grails.converters.JSON
  4import grails.plugins.springsecurity.Secured
  5import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils
  6
  7@Secured(['ROLE_EMP'])
  8class UsuarioController {
  9
 10    def springSecurityService
 11
 12    static allowedMethods = [crea: "POST", actualiza: "POST", elimina: "POST"]
 13
 14    def index = {
 15        redirect(action: "lista", params: params)
 16    }
 17
 18	def lista = {
 19		params.max = Math.min(params.max ? params.int('max') : 10, 100)
 20        def currentUser = springSecurityService.currentUser
 21		[usuarios: Usuario.findAllByEmpresa(currentUser.empresa, params), totalDeUsuarios: Usuario.countByEmpresa(currentUser.empresa)]
 22	}
 23
 24    def nuevo = {
 25        def usuario = new Usuario()
 26        usuario.properties = params
 27
 28        def roles = obtieneListaDeRoles(null)
 29
 30        return [usuario: usuario, roles: roles]
 31    }
 32
 33    def crea = {
 34        Usuario.withTransaction {
 35            def usuario = new Usuario(params)
 36            usuario.password = springSecurityService.encodePassword(params.password)
 37            def currentUser = springSecurityService.currentUser
 38            usuario.empresa = currentUser.empresa
 39            if (usuario.save(flush: true)) {
 40                def roles = asignaRoles(params)
 41                for(rol in roles) {
 42                    UsuarioRol.create(usuario, rol, false)
 43                }
 44                flash.message = message(code: 'default.created.message', args: [message(code: 'usuario.label', default: 'Usuario'), usuario.username])
 45                redirect(action: "ver", id: usuario.id)
 46            } else {
 47                log.error("Hubo un error al crear el usuario ${usuario.errors}")
 48                render(view: "nuevo", model: [usuario: usuario])
 49            }
 50        }
 51    }
 52
 53    def ver = {
 54        def usuario = Usuario.get(params.id)
 55        if (!usuario) {
 56            flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
 57            redirect(action: "lista")
 58        }
 59        else {
 60            def roles = obtieneListaDeRoles(usuario)
 61
 62            return [usuario: usuario, roles: roles]
 63        }
 64    }
 65
 66    def edita = {
 67        def usuario = Usuario.get(params.id)
 68        if (!usuario) {
 69            flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
 70            redirect(action: "lista")
 71        }
 72        else {
 73            def roles = obtieneListaDeRoles(usuario)
 74
 75            return [usuario: usuario, roles: roles]
 76        }
 77    }
 78
 79    def actualiza = {
 80        Usuario.withTransaction {
 81            def usuario = Usuario.get(params.id)
 82            if (usuario) {
 83                if (params.version) {
 84                    def version = params.version.toLong()
 85                    if (usuario.version > version) {
 86                        
 87                        usuario.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'usuario.label', default: 'Usuario')] as Object[], "Another user has updated this Usuario while you were editing")
 88                        render(view: "edita", model: [usuario: usuario])
 89                        return
 90                    }
 91                }
 92                if (usuario.password != params.password) {
 93                    usuario.password = springSecurityService.encodePassword(params.password)
 94                }
 95                params.remove('password')
 96                usuario.properties = params
 97                def currentUser = springSecurityService.currentUser
 98                usuario.empresa = currentUser.empresa
 99                if (!usuario.hasErrors() && usuario.save(flush: true)) {
100                    UsuarioRol.removeAll(usuario)
101                    def roles = asignaRoles(params)
102                    for(rol in roles) {
103                        UsuarioRol.create(usuario, rol, false)
104                    }
105                    flash.message = message(code: 'default.updated.message', args: [message(code: 'usuario.label', default: 'Usuario'), usuario.username])
106                    redirect(action: "ver", id: usuario.id)
107                }
108                else {
109                    render(view: "edita", model: [usuario: usuario])
110                }
111            }
112            else {
113                flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
114                redirect(action: "lista")
115            }
116        }
117    }
118
119    def elimina = {
120        def usuario = Usuario.get(params.id)
121        if (usuario) {
122            try {
123                def nombre = usuario.username
124                UsuarioRol.removeAll(usuario)
125                usuario.delete(flush: true)
126                flash.message = message(code: 'default.deleted.message', args: [message(code: 'usuario.label', default: 'Usuario'), nombre])
127                redirect(action: "lista")
128            }
129            catch (org.springframework.dao.DataIntegrityViolationException e) {
130                flash.message = message(code: 'default.not.deleted.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
131                redirect(action: "ver", id: params.id)
132            }
133        }
134        else {
135            flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
136            redirect(action: "lista")
137        }
138    }
139
140    @Secured(['ROLE_USER'])
141    def perfil = {
142        def usuario = springSecurityService.currentUser
143
144        def empresas
145        if (SpringSecurityUtils.ifAnyGranted('ROLE_ADMIN')) {
146            log.debug("Buscando empresas a nivel administrador")
147            empresas = Empresa.findAll("from Empresa e order by e.organizacion.nombre, e.nombre")
148        } else if(SpringSecurityUtils.ifAnyGranted('ROLE_ORG')) {
149            log.debug("Buscando empresas a nivel organizacion")
150            empresas = Empresa.findAll("from Empresa e where e.organizacion = :organizacion order by e.organizacion.nombre, e.nombre", [organizacion:usuario.empresa.organizacion])
151        } else {
152            log.debug("Asignando empresa")
153            empresas = [usuario.empresa]
154        }
155        
156        return [usuario:usuario, empresas:empresas]
157    }
158
159    @Secured(['ROLE_USER'])
160    def actualizaPerfil = {
161        Usuario.withTransaction {
162            def usuario = springSecurityService.currentUser
163            if (usuario) {
164                if (params.version) {
165                    def version = params.version.toLong()
166                    if (usuario.version > version) {
167                        
168                        usuario.errors.rejectValue("version", "default.optimistic.locking.failure", [message(code: 'usuario.label', default: 'Usuario')] as Object[], "Another user has updated this Usuario while you were editing")
169                        redirect(action: "perfil")
170                        return
171                    }
172                }
173                if (usuario.password != params.password) {
174                    usuario.password = springSecurityService.encodePassword(params.password)
175                }
176                params.remove('password')
177                usuario.properties = params
178                // TODO: Necesitamos validar por rol a donde se puede cambiar el usuario
179                // para no tener un hoyo de seguridad de que un usuario se pueda cambiar
180                // a una empresa / organizacion no permitida
181                if (!usuario.hasErrors() && usuario.save(flush: true)) {
182                    session.organizacion = usuario.empresa.organizacion
183                    session.empresa = usuario.empresa
184
185                    flash.message = message(code: 'usuario.perfil.updated.message', args: [usuario.username])
186                    redirect(uri: "/")
187                }
188                else {
189                    redirect(action: "perfil")
190                }
191            }
192            else {
193                flash.message = message(code: 'default.not.found.message', args: [message(code: 'usuario.label', default: 'Usuario'), params.id])
194                redirect(uri: "/")
195            }
196        }
197    }
198
199    def obtieneListaDeRoles = { usuario ->
200        log.debug "Obteniendo lista de roles"
201        def roles = Rol.list()
202
203        def rolesFiltrados = [] as Set
204        if (SpringSecurityUtils.ifAnyGranted('ROLE_ADMIN')) {
205            log.debug "Roles para ADMIN"
206            rolesFiltrados = roles
207        } else if(SpringSecurityUtils.ifAnyGranted('ROLE_ORG')) {
208            log.debug "Roles para ORG"
209            for(rol in roles) {
210                if (!rol.authority.equals('ROLE_ADMIN') && !rol.authority.equals('ROLE_ORG')) {
211                    rolesFiltrados << rol
212                }
213            }
214        } else if(SpringSecurityUtils.ifAnyGranted('ROLE_EMP')) {
215            log.debug "Roles para EMP"
216            for(rol in roles) {
217                if (rol.authority.equals('ROLE_USER')) {
218                    rolesFiltrados << rol
219                }
220            }
221        }
222        roles = rolesFiltrados
223        roles.sort { r1, r2 ->
224            r1.authority <=> r2.authority
225        }
226        Set userRoleNames = []
227        for (role in usuario?.authorities) {
228            userRoleNames << role.authority
229        }
230        LinkedHashMap<Rol, Boolean> roleMap = [:]
231        for (role in roles) {
232            roleMap[(role)] = userRoleNames.contains(role.authority)
233        }
234        return roleMap
235    }
236
237    def asignaRoles = { params ->
238        def roles = [] as Set
239        if (params.ROLE_ADMIN) {
240            roles << Rol.findByAuthority('ROLE_ADMIN')
241        } else if (params.ROLE_ORG) {
242            roles << Rol.findByAuthority('ROLE_ORG')
243        } else if (params.ROLE_EMP) {
244            roles << Rol.findByAuthority('ROLE_EMP')
245        } else {
246            roles << Rol.findByAuthority('ROLE_USER')
247        }
248        return roles
249    }
250}