有没有办法限制对所有对象的所有者访问Grails域对象?
例如,我可以轻松制作assert
,但我不想在任何地方复制它,或者冒险错过一个地点。
这与多租户不完全相同,因为它不仅仅是租户ID - 它可能是不同域对象的特定业务逻辑。
class MyDomain {
String name
String user
}
class MyController {
def show(Long id) {
def obj = MyDomain.get(id)
// *** How do I not do copy-paste this line in each individual controller
// that touches MyDomain?? ***
assert obj.user == CURRENT_USER
return obj
}
}
答案 0 :(得分:1)
有很多方法可以处理这种情况,正如其他答案所暗示的那样,但我认为采用Spring Security Plugin和spring-security-acl plugin的一种正确方法。 ACL插件将深入到对象级别并帮助您控制
根据doc
“ACL插件为Grails添加域对象安全性支持 使用Spring Security的应用程序。“
安全核心和ACL的组合可以帮助您实现所需。
答案 1 :(得分:0)
过滤器可能是一种方式,另一种方法是在可能的情况下调整查询。您可能需要能够搜索ID以外的其他一些条件。如果不再了解您的用例,很难给出更好的答案。
def show(String someValue) {
def currentUser = howeverYouGetYourUser
def obj = MyDomain.findByUserAndSomeValue(currentUser, someValue)
if (obj) {
// yeah!!!
} else {
// boo!!
}
}
理想情况下,如果您正在寻找特定用户的特定数据,那么ID就不是真正的方法。
答案 2 :(得分:0)
我不确定你是否可以在域级别进行,但有一种方法是使用过滤器。 Grails有一个过滤器插件。让用户保持会话状态并在过滤器中验证每个请求..
示例过滤器代码:
class SecurityFilters {
def filters = {
loginCheck(controller: '*', action: '*') {
before = {
if (!session.user && !actionName.equals('login')) {
redirect(action: 'login')
return false
}
}
}
}
}
并指定过滤器属性..
以下是文档grails.org/doc/2.2.1/ref/Plug-ins/filters.html