【问题标题】:How to secure grails web services with spring security如何使用 Spring Security 保护 Grails Web 服务
【发布时间】:2015-04-20 16:57:53
【问题描述】:

假设我有以下域类:

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 已登录,以下请求应返回书 1(它确实):

localhost:8080/myapp/api/book/1

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

localhost:8080/myapp/api/book/2

我希望其余 API 返回一个空数组或“拒绝访问”。我如何实现这一目标?我需要一种方法来处理所有请求类型,即 GET/POST/PUT/DELETE。

【问题讨论】:

标签: web-services grails spring-security restriction


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2017-07-12
    • 2014-04-13
    • 2017-05-27
    • 2015-12-11
    • 2011-06-07
    • 2013-11-29
    • 2014-02-09
    • 1970-01-01
    • 2015-03-23
    相关资源
    最近更新 更多