2010-01-13 1 views
0

ACEGI 플러그인을 사용하여 Grails 앱을 보안하고 내 컨트롤러 메서드에서 주석을 사용하여 로그인하라는 메시지를 표시합니다.로그인 한 사용자의 ID를 acegi를 사용하여 grails의 선택된 컨트롤러에 전달하는 방법

내 앱에는 login/auth 페이지로 리디렉션되는 로그인 링크가있는 정적 HTML 프론트 페이지가 있습니다. 로그인이 성공하면 person/mainpage이라는 인증 된 사용자에 대한 내 자신의 사용자 정의 페이지를로드하려고합니다. 내 LoginController에서

def index = { 
    if (isLoggedIn()) { 
     redirect uri: '/' 
    } 
    else { 
     redirect action: auth, params: params 
    } 
} 

/** 
* Show the login page. 
*/ 
def auth = { 

    nocache response 

    if (isLoggedIn()) { 
     redirect uri: '/' 
     return 
    } 

    String view 
    String postUrl 
    def config = authenticateService.securityConfig.security 
    if (config.useOpenId) { 
     view = 'openIdAuth' 
     postUrl = "${request.contextPath}/login/openIdAuthenticate" 
    } 
    else if (config.useFacebook) { 
     view = 'facebookAuth' 
     postUrl = "${request.contextPath}${config.facebook.filterProcessesUrl}" 
    } 
    else { 
     view = 'auth' 
     postUrl = "${request.contextPath}${config.filterProcessesUrl}" 
    } 

    render view: view, model: [postUrl: postUrl] 
} 

이 내가 원하는 것이 아니다 응용 프로그램 (/)의 메인 페이지로 돌아 성공적인 로그인을 리디렉션 ... 다음 코드가있다. 내가 이런 securityconfig.groovy 내 인증을 위해 기본 대상을 정의 할 수 있음을 발견하면서 약간에 대한 인터넷 검색을 ..

defaultTargetUrl = "/person/mainpage" 

내 질문은 내 PersonControllermainpage 행동에 착륙 할 때 로그인하는 사용자 식별하는 방법입니다 ? 처음에는

나는

def index = { 
    if (isLoggedIn()) { 
     redirect controller: person, action: mainpage, params: params 
    } 
    else { 
     redirect action: auth, params: params 
    } 
} 

... 이런 내 페이지로 리디렉션 인 LoginController 내 index 액션을 변경하지만의 ID는 I가 내가 생각하는합니다 (params에 나타나지 않는 사람에 로그인 URL 매개 변수로 사용자 행 ID를 정의하여 페이지를 끌어 올 수있는 것이 미친 것처럼 보이기 때문에 행복합니다.)

그럼 어떻게해야할까요? 기본적으로 내 person/mainpage 작업으로 현재 로그인 한 사용자를 해결할 수 있습니다.

답변

2

authenticateService를 사용하여 로그인 한 사용자에게 액세스 할 수 있습니다. 사용자/개인 도메인 인스턴스를 가져 오려면 authenticateService.userDomain()을 호출하고 인증 (getUsername() 메소드가 충분할 수 있음)을 얻으려면 authenticateService.principal()을 호출하십시오.

class PersonController { 

    def authenticateService 

    def mainpage = { 
     def user = authenticateService.userDomain() 
     if (user) { 
     log.info "you're logged in as $user.username" 
     } 
     else { 
     log.info "you're not logged in" 
     } 
     [user: user] 
    } 
} 

을 그리고 당신은 데이터를 렌더링하는 mainpage.gsp에서 사용할 수있는 '사용자'이 것 : 당신의 defaultTargetUrl 다음 "/ 사람/mainpage"인 경우 PersonController의 'mainpage'조치는 다음과 같이 보일 것입니다.

+0

나는 거의 도착했다. 다른 클래스 인 것으로 보이는 authenticateService.principal()을 사용하고있었습니다. authenticateService 인터페이스에 대한 설명서를 찾고 있는데, 그쪽으로 나를 가리킬 수 있습니까? – Simon

+0

관심사로서, 이것은 이런 종류의 문제에 대해 받아 들여진 접근 방식입니다. 약간의 해킹과 사용자의 컨텍스트가 수동으로 인증 서비스로 돌아 가지 않고도 사용할 수 있어야한다고 느낍니다. – Simon

+0

Principal을 SecurityContext에서 사용할 수 있으며 사용자 도메인 인스턴스가 이에 첨부됩니다. 직접 갈 수도 있지만 AuthenticateService는 구현 세부 정보를 숨 깁니다. 플러그인은 또한 'getAuthUserDomain()'메소드를 동일한 작업을 수행하는 컨트롤러에 삽입합니다. –

관련 문제