Jan
Jan

Reputation: 3401

Displaying a property of a Spring Security class in Grails

This is my user class that has Spring Security on it

package rms

import java.util.Date;
import java.util.Set;

import enums.EmployeeStatus;

class User {

   transient springSecurityService

   String username
   String password
   boolean enabled
   boolean accountExpired
   boolean accountLocked
   boolean passwordExpired


   String firstName
   String lastName
   String middleName
   String contactNumber
   String position
   String emailAddress
   String employeeID
   Date dateOfBirth
   EmployeeStatus employeeStatus
   int age
   byte [] picture

   static hasMany = [employeeReport: EmployeeReport]

   static constraints = {
      picture maxSize:20* 1024 * 1024
      dateOfBirth nullable: true
      employeeStatus blank: false
      position blank: false
      contactNumber blank: false
      emailAddress blank: false, matches: "([a-z0-9_.-]+)@([da-z.-]+).([a-z.]{2,6})", email: true
      age min: 18

      username blank: false, unique: true
      password blank: false, password: true
   }

   static mapping = { password column: '`password`' }

   Set<SecRole> getAuthorities() {
      SecUserSecRole.findAllBySecUser(this).collect { it.secRole } as Set
   }

   def beforeInsert() {
      encodePassword()
   }

   def beforeUpdate() {
      if (isDirty('password')) {
         encodePassword()
      }
   }

   protected void encodePassword() {
      password = springSecurityService.encodePassword(password)
   }

   String toString(){
      return "SecUser $username"
   }
}

I tried this tag <sec:loggedInUserInfo field="username"/> and it works fine but this doesn't work <sec:loggedInUserInfo field="firstName"/>. It gives a

No such property: firstName for class: org.codehaus.groovy.grails.plugins.springsecurity.GrailsUser

Is there any other way to display the other properties of the current logged in user?

Upvotes: 1

Views: 1448

Answers (1)

Burt Beckwith
Burt Beckwith

Reputation: 75671

The loggedInUserInfo can only access data from the "principal", which is typically an instance of GrailsUser. The data includes username, id, the assigned role names, and a few booleans about whether the user is enabled, the account is locked, etc. It's easy to subclass GrailsUser and create your own UserDetailsService and capture other data from the user domain class during authentication, and store that in the GrailsUser subclass to make it available to this tag; see http://grails-plugins.github.io/grails-spring-security-core/docs/manual.1273/guide/11%20Custom%20UserDetailsService.html for more info.

This works well if the data is read-only since it will be cached until the user logs out or the session expires. If the data that you want to display can change, retrieve the user instance and add it to the model map you return from the controller action:

class MyController {

   def springSecurityService

   def theAction() {
       ...
       def user = springSecurityService.currentUser
       [user: user, foo: 5, bar: "whatever", ...]
   }
}

and then you can display whatever you want in the GSP, e.g. ${user.firstName}

Upvotes: 2

Related Questions