2011-12-21 2 views
2

나는 처음으로 grails 애플리케이션을 개발 중이며 일부 페이지는 관리자 만 볼 수 있도록 보호하고 다른 사용자에게는 일부 권한을 부여하려고합니다.grails에서 액세스 제어, 역할 및 권한

grails에 Apache Shiro 플러그인을 사용하고 있습니다.

부트 스트랩에서 내 샘플 코드이

class BootStrap { 

def init = { servletContext -> 
    def adminRole 

    if(ShiroRole.findByName("Admin".isEmpty())){ 
     adminRole = new ShiroRole(name: "Administrator") 
     adminRole.addToPermissions("*:*") 
     adminRole.addToPermissions("admin") 

     adminRole.save() 

// '사용자'처럼 보이는 이제 모든 관리자 권한 }

if (ShiroUser.findAllByUsername("user").isEmpty()) { 
     def user = new ShiroUser(username: "user", passwordHash: new Sha256Hash("pass").toHex()) 
     user.addToPermissions("*:*") 
     user.addToRoles(adminRole) 

     user.save() 

    } 

    if (ShiroUser.findAllByUsername("Guest").isEmpty()) { 
     def user = new ShiroUser(username: "Guest", passwordHash: new Sha256Hash("pass").toHex()) 
     user.addToPermissions("inventory:*") 
     user.save() 
    } 


} 
def destroy = { 
} 

}

내 ShiroSecurityFilters이

모양을 가지고
class ShiroSecurityFilters { 
def filters = { 
    all(uri: "/**") { 
     before = { 
      // Ignore direct views (e.g. the default main index page). 
      if (!controllerName) return true 

      // Access control by convention. 
      accessControl() 

     } 
    } 
} 

}

발판에만 '손님'액세스 권한을 부여하고 싶습니다. 그러나 내 응용 프로그램에서 일단 사용자 "Guest"가 로그인하여 다른 컨트롤러에 액세스 할 수 있지만 그럴 필요는 없습니다. 도와 주셔서 감사합니다.

시로 (Shiro) 역할, 액세스 제어 및/또는 권한을 사용하는 것이 더 나을 경우 알려 주시기 바랍니다.

고맙습니다.

답변

1

확인. 바로 시작시 오타가

보자 ... : ...

"Admin".isEmpty() 

는 항상 false 것이 ... 그리고 난 당신이 정의 "거짓"아무 역할을하지 추측

그리고 당신은

adminRole.save(flush:true, failOnError:true) 

를 수행하는 대신... "관리자"하지만 만드는 "관리자"를

을 찾고 있습니다. 이렇게하면 개체가 실제로 저장됩니다. 당신이

user.addToRoles(adminRole) 

을 할 경우 (adminRole.addToPermissions("admin"))

...

역할 Administrator 이미 ("*:*"를) 모든 권한을 가지고 있으며, "admin"는 전형적인 시로 허가되지 않습니다, 그래서 당신은이 라인을 드롭 할 수 있습니다 "*:*" 권한을 추가 할 필요가 없습니다. 그 역할은 이미 충분합니다.

나는 shiro가 설치된 테스트 프로젝트를 만들고 create-auth-controller, create-wildcard-realmcreate-filters ShiroSecurity을 만들었습니다.

구성의 log4j 구성에 다음 두 줄을 추가하여 BootStrap 및 Shiro-Realm에 대한 로깅을 활성화하십시오.그루비 : 여기

debug 'grails.app.conf.BootStrap' 
debug 'grails.app.realm' 

내 BootStrap.groovy입니다 : (흥미로운 부분)

def init = { servletContext -> 
    def adminRole 

    if(ShiroRole.findByName("Administrator")==null){ 
     adminRole = new ShiroRole(name: "Administrator") 
     adminRole.addToPermissions("*:*") 
     adminRole.save(flush:true, failOnError:true) 
     log.debug adminRole.dump() 
    } 
    println ShiroUser.findAllByUsername("user").dump() 
    log.debug "="*80 
    if (ShiroUser.findAllByUsername("user").isEmpty()) { 
     def user = new ShiroUser(username: "user", passwordHash: new Sha256Hash("pass").toHex()) 
     user.addToRoles(adminRole) 
     user.save(flush:true, failOnError:true) 
     log.debug user.dump() 
    } 

    if (ShiroUser.findAllByUsername("Guest").isEmpty()) { 
     def user = new ShiroUser(username: "Guest", passwordHash: new Sha256Hash("pass").toHex()) 
     user.addToPermissions("inventory:*") 
     user.save(flush:true, failOnError:true) 
     log.debug user.dump() 
    } 

} 

내 ShiroSecurityFilters.groovy :

def filters = { 
    all(controller:'*', action:'*') { 
     before = { 
     // Ignore direct views (e.g. the default main index page). 
     if (!controllerName) return true 

     // Access control by convention. 
     accessControl() 

     } 
    } 
} 

하고 작동 ...

보시다시피, 내 SecurityFilters 컨트롤러 및 작업을 기반으로 ... 그냥 내 취향 ...

하지만 문제는 잘못된 부트 스트랩에만 기반한 것 같습니다. 로깅은 시로와 함께 작업 할 때 매우 유용합니다 ...

관련 문제