2009-05-27 3 views
3

Grace에서 Acegi/Spring Security 플러그인을 사용하여 웹 응용 프로그램을 작성 중이며 사용자 인스턴스의 변경 사항을 확인하는 데 문제가 있습니다. . Groovy/Grails로 약 3 주간 만 작업했기 때문에, 메일 링리스트와 튜토리얼에서 답변을 찾으려고 노력하고있어이 문제가 간단하다면 용서해주십시오.Acegi/Spring Security Grails 플러그인이 사용자 인스턴스에 대한 변경 사항을 보지 못했습니다.

사용자가 이메일 확인 토큰 또는 실명과 같은 추가 정보를 포함해야 할 때마다 사용자 도메인 클래스에 새로운 속성을 추가했습니다. 그 이유는 반대로 추천을 찾을 수 없기 때문입니다. 새로운 사용자를 만들면 모든 것이 잘된 것처럼 보이지만 사용자를 편집하면 사용자 목록에 변경 사항이 표시되지만 Acegi 태그 라이브러리 및 관련 기능에는 변경 사항이 표시되지 않습니다. 여기

는 UserController.update()에서 관련 조각입니다 :이 코드가 실행

def person = User.get(params.id) 
//...snip error checking... 

//Update user attributes 
person.username = params.email 
person.email = params.email 
person.userRealName = params.userRealName 

//Attempt to save changes 
if (person.save()) { 
    //If successful, redirect back to profile viewing page 
    redirect action: show, id: person.id 
    return 
} 
else { 
    //Otherwise, show errors and edit again 
    render view: 'edit', model: buildPersonModel(person) 
    return 
} 

후, 나는 항상 ID로 사용자 데이터를 얻는 경우에 변경 내용을 볼 수는 없지만 나는 이것은 Acegi 태그를 사용하는 경우 또는 기능.

loggedInUserInfo(field:'realName') 

을하지만이 작업을 수행합니다 : 예를 들어,이 작동하지 않습니다

User.get(loggedInUserInfo(field:'id').toLong()).realName 

새로운 정보 때로는 내가 로그 아웃 후 표시가 다시 있지만, 보통은 자주하지 않습니다 3 개 이상의 relogs 후에도 나타나지 않습니다. 또한, "flush : true"를 person.save()에 아무런 효과없이 추가하려고했습니다.

(주변 질문 : 그렇지 않으면 내가 그것을 정보를 추가하는 가장 좋은 방법은 무엇,이 같은 사용자 클래스와 바이올린을 켜는되는 것이 나쁜?) 더 조사 후

업데이트 : 그것을 정상적인 페이지에서 loggedInUserInfo()를 사용하는 것처럼 보이지만 제대로 작동하지만 레이아웃 내에서 사용하면 설명 된 동작을 나타냅니다. 어떤 이상한 캐싱 작업이 진행될 수 있습니까?

답변

2

이 문제의 해결 방법이 있으며 해당 문제에 대한 JIRA 항목을 만들었습니다.

Acegi이 내부적으로 사용자를 업데이트하는 방법에 버그가있는 것 같습니다. 컨트롤러에 액세스 할 때마다 사용자 권한을 수동으로 업데이트하는 grails 필터의 형태로 해결 방법을 제공합니다. 이상적은 아니지만 작동합니다.

건배,

+0

링크를 제공해 주셔서 감사합니다. 그러한 필터를 작성하는 방법의 예를 제공해 주시겠습니까? 나는 문제가있는 프로젝트에서 더 이상 일하지 않지만 다른 사람이 그것을 보면서 이익을 얻을 수 있다고 확신한다. –

+0

확실한 것. grails 필터에 대한 가이드는 다음과 같습니다. http://www.grails.org/Filters하지만 짧은 버전은 필터 파일을 grails-app/conf 디렉토리에두면 작동합니다. 건배 – sinjax

+0

+1 - 역할에 동일한 문제가 있었으며 JIRA의 해결 방법 필터가 문제를 해결했습니다. –

2

사용자 클래스를 수정 한 후에 grails generate-manager를 실행 했습니까?

+0

아니요, 저는 필요하지 않다는 것을 알지 못했습니다. 고맙습니다! 월요일까지는 테스트 할 수 없으므로 해결책인지 아닌지 말하기 몇일 전에 기다려 보겠습니다. –

+0

나는 약 3 개월 전 어느 것도 몰랐다. 하지만 http://www.infoq.com/articles/grails-acegi-integration에서 나는 "AuthUser/User에 새로운 필드를 추가하는 방법은 무엇입니까? 왜 2 가지 유형의 사용자입니까?"라는 주석에서 대답을 발견했습니다. 그게 내 문제를 해결했습니다. –

+0

죄송합니다. 그러나 문제가 해결되지 않습니다. 문제가 지속됩니다. 링크를 가져 주셔서 감사합니다. 세션에 캐시 된 데이터와 관련이 있다고 생각되지만 확실하지 않습니다. –

1

Acegi 캐시 사용자 정보 (올바르게 기억하는 경우). 'DefaultSecurityConfig'파일 (사용자 이름 캐시는 config/아래에 있음)을 확인하여 사용자 정보 캐시를 비활성화하십시오. 또한 authenticateService에 대한 메소드를 호출하여 (현재 어떤 메소드를 기억할 수 없는지) 사용자 캐시를 제거 할 수 있습니다.

UserController#update 클로저에서 후자를 찾을 수 있습니다.

+0

죄송합니다. cacheUsers = false로 설정해도 문제가 해결되지 않았습니다. 또한 authenticateService에서 사용자 캐시를 제거하는 방법을 찾을 수 없습니다. –

1

나는 똑같은 문제에 직면했고 위의 Maximilian Schweitzer가 준 권고를 따랐다. 그것은 처음에는 나를 위해 작동하지 않았다.

다음 단계 시도를 부여하고 문제가 해결되는지 확인하십시오 :
  1. 내가 막시밀리안 슈바이처 이상 대답에 따라 생성 - 관리자를 실행합니다. 새로운 사용자로 로그인을 시도
  2. 가 잘 작동 (새 UserController, GSP 등으로) 내가 새 사용자를 생성
  3. 작동하지 않았다 -
  4. 내가 생성 - 관리자를 실행하기 전에 생성 된 사용자로 로그인했습니다.
  5. 전에 생성 된 이전 사용자를 삭제하고 다시 작성했습니다. 괜찮 았어.

귀하의 상황에 해당하는지는 확실하지 않지만

HTH!

+0

다양한 모델과 컨트롤러를 아직 수정하지 않았다면이 방법을 시도 할 것이지만 해결 방법이 있으므로 거짓말을 할 것입니다. –

1

저도 같은 문제에 직면했다. 내 솔루션은 버전 0.5.1 (acegi 0.5.1 - Grails Spring Security 2.0 Plugin)으로 acegi 플러그인을 업데이트하는 것이었다.

은 그 때 나는 /plugins/acegi-0.5.1/grails-app/conf/DefaultSecurityConfig.groovy

지금 짜잔
cacheUsers = false 

및 설정했습니다! 그것은 일하고있다!

루이스

0

인증 된 사용자를 재설정해야합니다. 아래의 코드는 (this blog에서) 그 작업을 수행합니다.

import org.springframework.security.context.SecurityContextHolder 
import org.springframework.security.providers.UsernamePasswordAuthenticationToken 
import org.codehaus.groovy.grails.plugins.springsecurity.GrailsUserImpl 
import org.springframework.security.GrantedAuthority 
import org.springframework.security.GrantedAuthorityImpl 

... 

def refreshAuthenticatedUser(user) { 
    GrantedAuthority[] auths = user.authorities.collect { 
     new GrantedAuthorityImpl(it.authority) 
    } 
    def grailsUser = new GrailsUserImpl(
      user.username, 
      "", 
      user.enabled, 
      true, 
      true, 
      true, 
      auths, 
      user) 
    def authToken = new UsernamePasswordAuthenticationToken(grailsUser, '', auths) 
    SecurityContextHolder.context.authentication = authToken 

} 
관련 문제