假设我有以下Domain类:
import grails.rest.Resource
@Resource(formats=['json'], uri='/api/book')
class Book {
String name
static belongsTo = [user: User]
}
我已经在Config.groovy中定义了spring安全拦截UrlMap来限制URL访问:
'/api/book': ['ROLE_USER']
假设系统中有两本书和两个用户,并且ID为1的书属于用户1,第二本书属于用户2。用户1已登录,以下请求应返回书1(这样做):
localhost:8080/myapp/api/book/1
但是如果同一用户请求以下资源:
localhost:8080/myapp/api/book/2
我希望其余的API返回一个空数组或“访问被拒绝”。我该如何实现?我需要一种处理所有请求类型(即GET / POST / PUT / DELETE)的方法。
通过生成相应的Web服务控制器来解决此问题:
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
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句