如何使用 spring 安全性来保护 Grails Web 服务

How to secure grails web services with spring security

假设我有以下域 class:

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

我在 Config.groovy 中定义了 spring security interceptUrlMap 以限制 url 访问:

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

假设系统中有两本书和两个用户,id为1的书属于用户1,第二本书属于用户2。用户1登录后,下面的请求应该return 第 1 本书(它确实如此):

localhost:8080/myapp/api/book/1

但如果同一用户向以下资源发出请求:

localhost:8080/myapp/api/book/2

我想要其余 API 到 return 一个空数组或 "access denied"。我如何实现这一目标?我需要一种方法来处理所有请求类型,即 GET/POST/PUT/DELETE。

通过生成相应的网络服务控制器解决了这个问题:

grails generate-controller Book

并为每个操作添加了限制,即索引、显示、保存、更新、删除。

例如用于获取资源的 Show 操作:

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