2015-04-14 6 views
1

Предположим, у меня есть следующий класс домена:Как обезопасить Grails веб-служб с пружинным безопасности

import grails.rest.Resource 
@Resource(formats=['json'], uri='/api/book') 
class Book { 
    String name 
    static belongsTo = [user: User] 
} 

Я определил пружинный interceptUrlMap безопасности в Config.groovy, чтобы ограничить доступ к URL:

'/api/book':      ['ROLE_USER'] 

Lets предположим, что в системе есть две книги и два пользователя, а книга с идентификатором 1 принадлежит пользователю 1, а вторая книга принадлежит пользователю. 2. Пользователь 1 зарегистрирован, и следующий запрос должен вернуть книгу 1 (что она делает):

localhost:8080/myapp/api/book/1 

, но если тот же пользователь делает запрос на следующий ресурс:

localhost:8080/myapp/api/book/2 

Я хочу остальной API, чтобы вернуть пустой массив или «доступ запрещен». Как мне это достичь? Мне нужен подход там всех типов запросов, то есть GET/POST/PUT/DELETE.

+0

есть посмотрите на http://grails-plugins.github.io/grails-spring-security-acl/docs/manual/guide/single.html – cfrick

+0

Но тогда я должен определить каждое «действие» самостоятельно, я хочу пользователь Grails веб-сервисы. – ux11

ответ

0

решаемые эту проблему путем создания соответствующего контроллера веб-службы:

grails generate-controller Book 

И добавил ограничение для каждого действия, т.е. индекс, шоу, сохранения, обновления, удаления.

Например Отображать действие, которое используется для получения ресурса:

localhost:8080/myapp/api/book/1 

изменяется выглядеть как следующий код:

import static org.springframework.http.HttpStatus.* 
import grails.transaction.Transactional 

@Transactional(readOnly = true) 
class BookController { 

    def springSecurityService 
    static allowedMethods = [save: "POST", update: "PUT", delete: "DELETE"] 

    Code omitted... 

    def show(Book bookInstance) { 
     if(bookInstance == null){ 
      notFound() 
      return 
     } 
     def user = springSecurityService.currentUser 
     if(bookInstance.user.id == user.id) { 
      respond bookInstance 
      return 
     } 
     notFound() 
    } 

    Code omitted... 
} 
версия

Grails: 2.4.4