【问题标题】:Restricting Data Returned from a Grails Restful Service with AngularJS使用 AngularJS 限制从 Grails Restful 服务返回的数据
【发布时间】:2014-05-24 19:50:52
【问题描述】:

我是使用 AngularJS 的新手,想使用 REST 与 Grails 集成。虽然我找到了很多关于使用 Grails/AngularJS 执行 CRUD 操作的精彩教程,但我发现很少有帮助我了解根据登录用户限制从 Grails RESTful 服务返回到 Angular 的数据的最佳方法。我不想问我知道这里的一个意见问题有点不受欢迎,但在这种情况下,我认为它是相关的,并且对于其他人学习如何使用 Grails/Angular 构建现实世界的应用程序确实有益。

假设我们有一个简单的域类:

    class Book {

    String title
    String author

    static constraints = {
    }
}

我们将其公开为 RESTful 控制器(普通版)

    import grails.rest.RestfulController

class BookController extends RestfulController<Book>{

    def springSecurityService
    static responseFormats = ['json', 'xml']

    BookController(){
        super(Book)
    }

}

就我而言,我使用的是资产管道 Grails 插件。我有一个角度控制器:

var book = angular.module('book', []);

book.controller('BookCtrl',
    function ($scope, $http) {

        $scope.getBook = function () {
            $http.get('/myApp/book').
                success(function (data) {
                    console.log("success: " + data);
                    $scope.book = data;
                }).error(function (data) {
                    console.log("error: " + data);
                    $scope.book = data;
                });
        };

        $scope.getBook();
    }
);

和视图(缩写):

    <div>
        <table class="table table-hover">
            <tr>
                <th>Title</th>
                <th>Author</th>
            </tr>

            <tr ng-repeat="b in book">
                <td>{{b.title}}</td>
                <td>{{b.author}}</td>
            </tr>
        </table>
    </div>

当我只是寻找所有书籍对象的列表时,这很好用,我得到了一张漂亮的书籍表。但是当我想说限制基于用户登录的书籍返回时(假设在这种情况下它是用户拥有的书籍列表),我不确定什么可能是最好的继续方式。从身份验证的角度来看,我认为使用 Spring Security REST plugin 可能有助于将令牌作为参数传递给 BookController(假设我覆盖了 index() 方法)。然后我可以在 REST 响应中查找令牌并过滤结果。这似乎是正确的方法吗?感谢您的任何反馈,

【问题讨论】:

  • 用户拥有的图书列表 - 在Book 域中是如何定义的?我们如何确定登录用户拥有哪本书?其他域类中是否存在映射?
  • 是的,它不在上面的代码中,但它可能是一些简单的东西,例如人和书之间的连接/查找表,并在控制器中以如下方式实现:code index(user) { respond books = Book.findByUser(user)} code 显然是一种简化
  • 我并不真正担心缩小列表,因为我想知道在代码中的正确位置?它应该是 REST 控制器方法的一部分吗?并将身份验证令牌作为 GET 的一部分传递是处理它的正确方法吗?

标签: angularjs rest grails spring-security


【解决方案1】:

是的,请参考这个sample Angular/Grails app,它使用grails-spring-security-rest 插件进行基于令牌的身份验证/身份验证。要回答您的问题,您必须同时做到以下两点:

  1. 来自客户端 (Angular) 的基于令牌的身份验证以访问 REST 服务。
  2. 在服务器端过滤用户拥有的图书。

示例应用中展示了基于令牌的身份验证。对于过滤用户,您最终可能会在控制器中执行此操作:

def index() {

    //getPrincipal() is a method on controller metaClass
    //used here for convenience which is similar to saying
    //springSecurityService.principal.username

    respond Book.findByUser( principal.username )
}

以上内容基于您提到的假设,即在某处会有一个连接表来表示登录用户拥有书籍。

【讨论】:

  • 感谢您的回复,示例应用程序很棒。我不知道我是怎么在搜索中没有遇到这个的。非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-15
  • 1970-01-01
  • 2013-09-13
  • 2012-02-08
  • 1970-01-01
  • 2014-01-28
  • 1970-01-01
相关资源
最近更新 更多