2014-01-10 1 views
0

Grails 2.2.3과 Spring Security ACL Plugin 1.1.1을 사용하고 있습니다. public으로 열린 URL을 가지고 싶습니다. @PostAuthorize annotation을 사용하는 서비스 레이어가 리소스를 보호합니다. 사용자가 특정 객체에 액세스 할 수 있는지 여부를 결정하기 위해 먼저 객체를 살펴야합니다.스프링 보안 ACL이 AccessDeniedException을 던진 후 어떻게 자격 증명을 요청할 수 있습니까?

컨트롤러 레이어에서 AccessDeniedException을 catch 한 다음 브라우저에서 자격 증명을 요청하고 다시 시도하도록 할 수 있습니다. 응답 상태를 401로 설정하고 다시 시도하기 위해 자체로 리디렉션하는 순진한 방법을 시도했습니다. 내가 만난 문제는 브라우저가 자격 증명을 요청하지 않았다는 것입니다.

@Secured(['IS_AUTHENTICATED_ANONYMOUSLY']) 
def controllerAction() { 
    try { 
     someService.action() 
    } catch (AccessDeniedException ade) { 
     // if logged in show FORBIDDEN, if not ask for credentials and try again 
    } 
} 

을 그리고 서비스 계층은 단순히 것이다 :

내가 컨트롤러 레이어에 어떻게하고 싶은 것을 코드에이를 넣으려면

@PostAuthorize("""returnObject.availability == 'ALL'""") 
def action() { 
    PersistedObject.findById(1) 
} 

덕분에 어떤 도움을!

+0

응답 상태를 401로 설정하고 리디렉션하는 코드도 게시 할 수 있습니까? 어쨌든 ACL을 통해 모든 사용자가 사용할 수있는 객체에 대한 액세스 권한을 부여하는 것이 가능할 수 있습니다. 그러면 객체를 먼저로드하여 사용자가 그러한 객체로 작업 할 수 있는지 확인해야 할 필요가 없습니다. 단순히 예 : 모든 사용자에게 지정된 역할 (예 : ROLE_USER)에 대한 읽기 권한 – pgiecek

+0

우리가 이미하고있는 일입니다. 리디렉션은 단순히 response.status = 401, redirect (self)로 설정했습니다. 리디렉션의 문제는 로그인을 요구하지 않는 302 상태로 설정하는 것입니다. 문제는 이러한 개체에 익명으로 액세스하는 것이 아니라 익명으로 개체에 액세스하는 것입니다. 그런 다음 사용자 이름/암호를 묻는 데 실패하면 문제가 발생합니다. –

+0

귀하의 흐름을 올바르게 이해하고 있는지 확신 할 수 없습니다. 401 또는 302 HTTP 응답을 보내시겠습니까? 302 HTTP 응답을 보낼 때 사용자는 일반적으로 사용자 에이전트 (예 : 웹 브라우저)가 자동으로 위치 헤더에 명시된 URL로 리디렉션하기 때문에이를 인식하지 못합니다. 어쨌든, AccessDeniedException은 사용자가 인증되지 않았 음을 의미하는 것이 아니라 사용자가 일부 자원에 액세스 할 수있는 권한이 없음을 의미합니다. 올바른 응답은 HTTP 403이어야합니다. 아마도 가장 쉬운 방법은 사용자가 필요로하는 것을 반환 할 사용자 정의'org.springframework.security.web.access.AccessDeniedHandler'를 구현하는 것입니다. – pgiecek

답변

0

문제가 해결되어 401 상태 코드와 함께 보낼 헤더가 누락되었습니다. 나는 당신이 원하는 무엇보다 무엇을 해결하려면

은 다음과 같습니다

@Secured(['IS_AUTHENTICATED_ANONYMOUSLY']) 
def controllerAction() { 
    try { 
     someService.action() 
    } catch (AccessDeniedException ade) { 
     if (!springSecurityService.isLoggedIn()) { 
     response.setHeader 'WWW-Authenticate', 'Basic realm="Grails Realm"' // the missing line 
     response.sendError HttpServletResponse.SC_UNAUTHORIZED 
    } 
} 

자격 증명을 제출 한 후 내가 찾던하면 브라우저 내에서 자동으로 발생 "리디렉션". 나는 리다이렉트를 위해 특정한 것을 필요로한다는 것을 착각했다.