2016-11-14 3 views
0

Я использую ядро ​​весной безопасности для проверки подлинности в моем веб-приложение, но я не могу понять, как получить пользовательскую информацию от моего пользовательского класса вот мой пользовательский класс: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) 
+0

Вы просто хотите получить доступ к информации о классе пользователя в другом методе или в классе? –

+0

Я хочу получить доступ к пользовательской информации из другого класса или представления, в этом случае данные из этого объекта Colaborador – xSlok

ответ

1

documentation контуры (шаг за шагом), как создать пользовательский UserDetailsService. Он проведет вас через процесс его создания и зарегистрирует его в вашем приложении.

+0

Я пробовал это, и теперь я получаю эту ошибку: '2016-11-14 11: 56: 46,061 [http-bio-80-exec-4] ERROR authentication.GrailsUsernamePasswordAuthenticationFilter - Внутренняя ошибка при попытке аутентификации пользователя. Сообщение: Не удалось найти подходящий конструктор для: 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) 'когда я вхожу в систему в своем приложении (я поставлю редактирование своего вопроса и добавлю новый код) – xSlok

+0

Вы зарегистрировали свой' UserDetailsService' в 'resources.groovy'? –

+0

я сделал, это мой resources.groovy 'импорт core.MyUserDetailsService бобы = { UserDetailsService (MyUserDetailsService) }' – xSlok

Смежные вопросы