【问题标题】:Grails Spring Security core - Custom user information?Grails Spring Security核心 - 自定义用户信息?
【发布时间】:2016-11-14 04:27:09
【问题描述】:

我在我的 web 应用程序中使用 spring security core 进行身份验证,但我不知道如何从我的 User 类中获取自定义信息 这是我的用户类:

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 访问它并且没有成功,我读到我需要创建一个自定义 UserDetailsS​​ervice ,但我不知道如何以及在哪里创建它,有人可以帮我吗?

谢谢!

@编辑

我尝试遵循文档并创建了两个类

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 对象的数据

标签: java spring spring-mvc grails


【解决方案1】:

documentation 概述(逐步)如何创建自定义UserDetailsService。它将引导您完成创建它并在您的应用程序中注册它的过程。

【讨论】:

  • 我已经尝试过了,现在我收到了这个错误: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) 当我登录我的应用程序时(我将编辑我的问题并添加新代码)
  • 您是否在resources.groovy 中注册了您的UserDetailsService
  • 我做到了,这是我的资源。groovy import core.MyUserDetailsService beans = { userDetailsService(MyUserDetailsService) }
  • 我会停止应用程序,运行grails clean 看看是否能解决问题。
  • 我清理了它,现在我在运行我的应用程序时收到此错误消息:Error creating bean with name 'grailsApplication' defined in ServletContext resource [/WEB-INF/applicationContext.xml]: Invocation of init method failed; nested exception is org.codehaus.groovy.grails.exceptions.GrailsConfigurationException: Class not found loading Grails application: core.MyUserDetails
猜你喜欢
  • 2013-12-13
  • 2012-05-23
  • 2015-07-01
  • 2012-05-24
  • 2011-11-23
  • 2016-05-24
  • 2017-06-05
  • 2021-09-09
  • 2016-07-09
相关资源
最近更新 更多