我是使用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响应中查找令牌并过滤结果。这看起来像是正确的做法吗?感谢您的任何反馈,
答案 0 :(得分:4)
是的,请参考sample Angular/Grails app使用grails-spring-security-rest插件进行基于令牌的authn / authz。要回答你的问题,你必须同时做到这两点:
示例应用程序中展示了基于令牌的身份验证。对于过滤用户,您最终可能会在控制器中执行此操作:
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 )
}
上面会根据你提到的假设有一个联接表来说明登录用户拥有书籍。