使用AngularJS限制从Grails Restful服务返回的数据

时间:2014-04-10 21:26:29

标签: angularjs rest grails spring-security

我是使用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>

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

1 个答案:

答案 0 :(得分:4)

是的,请参考sample Angular/Grails app使用grails-spring-security-rest插件进行基于令牌的authn / authz。要回答你的问题,你必须同时做到这两点:

  1. 来自客户端(Angular)的基于令牌的身份验证,用于访问REST服务。
  2. 过滤用户在服务器端拥有图书。
  3. 示例应用程序中展示了基于令牌的身份验证。对于过滤用户,您最终可能会在控制器中执行此操作:

    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 )
    }
    

    上面会根据你提到的假设有一个联接表来说明登录用户拥有书籍。