2015-01-11 1 views
1

@RequiresPermissions을 사용했을 때 'RequiresPermissions'오류를 해결할 수 없습니다. 이미 org.apache.shiro.authz.annotation.RequiresPermissions을 수입했습니다. 주석 @RequiresPermissions("module:books:list")시로 (shiro) 주석이 grails에서 작동하지 않습니다. 아무도 나에게 무엇을 잘못 제안 할 수 있습니까?

내 권한 클래스

class AuthController { 

    def shiroSecurityManager 

    def index = { redirect(action: "login", params: params) } 

    def login = { 
     return [ username: params.username, rememberMe: (params.rememberMe != null), targetUri: params.targetUri ] 
    } 

    def signIn = { 
     def authToken = new UsernamePasswordToken(params.username, params.password as String) 

     // Support for "remember me" 
     if (params.rememberMe) { 
      authToken.rememberMe = true 
     } 

     // If a controller redirected to this page, redirect back 
     // to it. Otherwise redirect to the root URI. 
     def targetUri = params.targetUri ?: "/" 

     // Handle requests saved by Shiro filters. 
     SavedRequest savedRequest = WebUtils.getSavedRequest(request) 
     if (savedRequest) { 
      targetUri = savedRequest.requestURI - request.contextPath 
      if (savedRequest.queryString) targetUri = targetUri + '?' + savedRequest.queryString 
     } 

     try{ 
      // Perform the actual login. An AuthenticationException 
      // will be thrown if the username is unrecognised or the 
      // password is incorrect. 
      SecurityUtils.subject.login(authToken) 

      log.info "Redirecting to '${targetUri}'." 
      redirect(uri: targetUri) 
     } 
     catch (AuthenticationException ex){ 
      // Authentication failed, so display the appropriate message 
      // on the login page. 
      log.info "Authentication failure for user '${params.username}'." 
      flash.message = message(code: "login.failed") 

      // Keep the username and "remember me" setting so that the 
      // user doesn't have to enter them again. 
      def m = [ username: params.username ] 
      if (params.rememberMe) { 
       m["rememberMe"] = true 
      } 

      // Remember the target URI too. 
      if (params.targetUri) { 
       m["targetUri"] = params.targetUri 
      } 

      // Now redirect back to the login page. 
      redirect(action: "login", params: m) 
     } 
    } 

    def signOut = { 
     // Log the user out of the application. 
     SecurityUtils.subject?.logout() 
     webRequest.getCurrentRequest().session = null 

     // For now, redirect back to the home page. 
     redirect(uri: "/") 
    } 

    def unauthorized = { 
     render "You do not have permission to access this page." 
    } 
} 

내 응용 프로그램이 실행될 때 사용되지만 내가 설정 한 사용자를 사용하여 로그인 할 때, 그것은 직접적으로 승인되지 않은 페이지로 저를 보냅니다. 사용자에게 일부 권한을 허용했습니다.

+0

코드와 전체 오류 메시지를 게시하십시오. – Floegipoky

답변

1

해당 주석 (또는 소스)에 대해 the Javadoc을 보면 형식 (클래스 수준)과 메서드 (@Target(value={TYPE,METHOD}))에 할당 할 수 있음을 알 수 있습니다. 컨트롤러 액션을 클로저로 정의하고 있습니다.이 액션은 여전히 ​​Grails 2.0 이상에서 지원되지만 메소드는 지금 선호됩니다. Grails와 Groovy가 메서드처럼 사용할 수있게 해 주더라도 메소드가 아니기 때문에 클로저에 주석을 사용할 수 없습니다. Target 주석에 FIELD이 포함되어 있으면 다른 유형과 함께 작동하지만 Shiro 라이브러리는 Grails 컨트롤러에서 클로저를 직접 지원하지 않기 때문에 작동하지 않습니다.

클로저에서 메소드로 모든 작업을 변경하십시오 (예 :

def index() { redirect(action: "login", params: params) } 

def login() { 
    ... 
} 

.... 

다음 주석을 달 수 있습니다.

+0

이 문제는 해결되었습니다. 이제 사용자에게 부여되지 않은 페이지에 액세스하려고 시도하면 예외가 발생합니다. 사용자가 액세스하려고 시도하면 홈 페이지로 리디렉션되지 않습니다. 비양심적 인 페이지? –

+0

죄송 합니다만, 나는 Shiro를 사용하지 않습니다. 예외 메시지 및 스택 추적으로 새 질문을하고이 대답을 받아들입니다. :) –

관련 문제