如何使用 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
假设我有以下域 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