Я использую ядро весной безопасности для проверки подлинности в моем веб-приложение, но я не могу понять, как получить пользовательскую информацию от моего пользовательского класса вот мой пользовательский класс:Grails Spring Security core - Пользовательская информация пользователя?
package core
import beans.Colaborador
import groovy.transform.EqualsAndHashCode
import groovy.transform.ToString
@EqualsAndHashCode(includes = 'username')
@ToString(includes = 'username', includeNames = true, includePackage = false)
class Usuario implements Serializable {
private static final long serialVersionUID = 1
transient springSecurityService
String username
String password
boolean enabled = true
boolean accountExpired
boolean accountLocked
boolean passwordExpired
Colaborador colaborador
Usuario(String username, String password) {
this()
this.username = username
this.password = password
}
Set<Permissao> getAuthorities() {
UsuarioPermissao.findAllByUsuario(this)*.permissao
}
def beforeInsert() {
encodePassword()
}
def beforeUpdate() {
if (isDirty('password')) {
encodePassword()
}
}
protected void encodePassword() {
password = springSecurityService?.passwordEncoder ? springSecurityService.encodePassword(password) : password
}
static transients = ['springSecurityService']
static constraints = {
username blank: false, unique: true
password blank: false
colaborador nullable: true
}
static mapping = {
password column: '`password`'
}
}
Информация, которую я хочу для использования внутри объекта Colaborador, но если я попытаюсь получить к нему доступ, используя sec: loggedInUserInfo и не имел успеха, я прочитал, что мне нужно создать пользовательский UserDetailsService, но я не мог узнать, как и где создать его, может кто-нибудь дать мне руку?
Спасибо!
@Edit
Я попытался следующие документацию и создать два класса
import beans.Colaborador
import grails.plugin.springsecurity.userdetails.GrailsUser
import org.springframework.security.core.GrantedAuthority
class MyUserDetails extends GrailsUser {
final Colaborador colaborador
MyUserDetails(String username, String password, boolean enabled,
boolean accountNonExpired, boolean credentialsNonExpired,
boolean accountNonLocked,
Collection<GrantedAuthority> authorities,
long id, Colaborador colaborador) {
super(username, password, enabled, accountNonExpired,
credentialsNonExpired, accountNonLocked, authorities, id)
this.colaborador = colaborador
}
}
и
package core
import grails.plugin.springsecurity.SpringSecurityUtils
import grails.plugin.springsecurity.userdetails.GrailsUserDetailsService
import grails.plugin.springsecurity.userdetails.NoStackUsernameNotFoundException
import grails.transaction.Transactional
import org.springframework.security.core.authority.SimpleGrantedAuthority
import org.springframework.security.core.userdetails.UserDetails
import org.springframework.security.core.userdetails.UsernameNotFoundException
class MyUserDetailsService implements GrailsUserDetailsService {
static final List NO_ROLES = [new SimpleGrantedAuthority(SpringSecurityUtils.NO_ROLE)]
UserDetails loadUserByUsername(String username, boolean loadRoles)
throws UsernameNotFoundException {
return loadUserByUsername(username)
}
@Transactional(readOnly = true, noRollbackFor = [IllegalArgumentException, UsernameNotFoundException])
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
Usuario user = Usuario.findByUsername(username)
if (!user) throw new NoStackUsernameNotFoundException()
def roles = user.authorities
def authorities = roles.collect {
new SimpleGrantedAuthority(it.authority)
}
return new MyUserDetails(user.username, user.password, user.enabled,
!user.accountExpired, !user.passwordExpired,
!user.accountLocked, authorities ?: NO_ROLES, user.id,
user.colaborador)
}
}
и когда я войти в систему в мое приложение, я получаю эту ошибку:
2016-11-14 11:56:46,061 [http-bio-80-exec-4] ERROR authentication.GrailsUsernamePasswordAuthenticationFilter - An internal error occurred while trying to authenticate the user.
Message: Could not find matching constructor for: java.lang.Object(java.lang.String, java.lang.String, java.lang.Boolean, java.lang.Boolean, java.lang.Boolean, java.lang.Boolean, java.util.ArrayList, java.lang.Long)
Вы просто хотите получить доступ к информации о классе пользователя в другом методе или в классе? –
Я хочу получить доступ к пользовательской информации из другого класса или представления, в этом случае данные из этого объекта Colaborador – xSlok