Grails,从Acegi升级到Spring安全插件

时间:2011-06-01 12:57:14

标签: security spring grails groovy spring-security

昨天我开始将我们的Grails应用程序从Acegi插件0.5.2升级到Spring安全插件。我遇到了一些问题,也许有人可以帮忙吗?

在进行必要的更改后(由Burt Beckwith在Migrating from the Acegi Plugin上记录)我能够再次启动Grails应用程序(哇哦!)。但是,登录不再有效。

我们的情况如下:我们将Grails应用程序纯粹用于其应用程序逻辑。通过webservices使用用户名和密码完成身份验证。作为后端,我们使用app(dao)和LDAP后端的数据库。目前,我们已禁用LDAP,以便于测试。

这是进行身份验证的代码:

def authenticate(String username, String password) {
try {
      println "Trying authentication with user " + username + " and password " + password + "."
      def tempToken = new UsernamePasswordAuthenticationToken(username, password)
      println "Temptoken is " + tempToken
      def token = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password))
      println "Authentication token received was: " + token
    } catch (AuthenticationException authenticationException) {
        return false
    }
    return true     
}

打印到日志:

Trying authentication with user admin and password admin.
Temptoken is org.springframework.security.providers.UsernamePasswordAuthenticationToken@1f: Principal: admin; Password: [PROTECTED]; Authenticated: false; Details: null; Not granted any authorities

然后一切都停止了。

我们使用的域类非常简单。我们不会使用诸如用户角色之类的类来加入人与其权限之间的联接。相反,我们使用多对多映射,因为这一直对我们有用并且易于维护。

我们的权限域类:

class Authority {
static hasMany = [people: Person]

/** description */
String description
/** ROLE String */
String authority = ''

String authorityType

static constraints = {
    authority(help:'x',class:'wide',blank: false,unique:true)
    description(help:'x',class:'extrawide')
    authorityType(help:'x',class:'wide')
    people(help:'x',selectSort:'username',display:false)
}   

String toString() {
      return authority;
}   
}

我们的Person域类:

class Person  {

static hasMany = [authorities: Authority]
static belongsTo = Authority

//Authority primaryGroup

/** Username */
String username
/** User Real Name*/
String userRealName
String familyName
String givenName

/** MD5 Password */
String passwd
/** enabled */
boolean enabled

String email
boolean emailShow

/** description */
String description = ''



static constraints = {
    username(blank: false, unique: true,help:'x',class:'wide')
    userRealName(blank: false,help:'x',class:'wide')
    familyName(blank: false,help:'x',class:'wide')
    givenName(blank: false,help:'x',class:'wide')
    email(help:'x',class:'wide')
    emailShow(help:'x')
    enabled(help:'x')
    passwd(blank: false,password:true,show:false,help:'x',class:'wide')
    authorities(nullable:true,help:'x',sortable:true,selectSort:'authority')        
}

String toString() {
      return username;
  }
}

在Config.Groovy中,我们定义了:

security {
active = false
cacheUsers = false

grails.plugins.springsecurity.providerNames = ['daoAuthenticationProvider', 'anonymousAuthenticationProvider', 'rememberMeAuthenticationProvider']

grails.plugins.springsecurity.userLookUp.userDomainClassName = "Person"
grails.plugins.springsecurity.authority.className = "Authority"

就文档而言,这应该通过各种方式工作(因此它适用于“旧的”Acegi设置)。

为了收集更多见解,我简要地激活了LDAP并发现了同样的问题。 WireShark告诉我在登录过程中没有进行任何LDAP调用。我的猜测是,要么Authenticate函数中的代码有问题,要么SpringSecurity不知道如何获取我们的域类。

我很高兴看到任何见解!

1 个答案:

答案 0 :(得分:0)

似乎令牌无效,因此authenticate()调用失败并生成异常(IIRC仅在调用成功时才返回值)。

我的第一次尝试是检查数据库是否有用户行:'admin',密码:'admin'用于环境。

经过一番思考,我会仔细检查Person类中的密码属性。通过域类中的映射,或者更好地通过

userLookup.passwordPropertyName = "passwd"

更新:要检查的第三件事。

active = false