Security Grails域对象-限制对特定用户的访问
有没有办法限制对象所有者对Grails域对象的全面访问 例如,我可以轻松地创建一个Security Grails域对象-限制对特定用户的访问,security,grails,gorm,Security,Grails,Gorm,有没有办法限制对象所有者对Grails域对象的全面访问 例如,我可以轻松地创建一个断言,但我不想到处重复,也不想冒漏掉一点的风险 这与多租户并不完全相同,因为它不仅仅是租户ID——它可能是不同域对象的特定业务逻辑 class MyDomain { String name String user } class MyController { def show(Long id) { def obj = MyDomain.get(id) // *** How do I n
断言,但我不想到处重复,也不想冒漏掉一点的风险
这与多租户并不完全相同,因为它不仅仅是租户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
}
}
筛选可能是一种方法,另一种方法是调整查询(如果可能)。您可能需要能够搜索ID以外的其他条件。如果不进一步了解您的用例,就很难给出更好的答案
def show(String someValue) {
def currentUser = howeverYouGetYourUser
def obj = MyDomain.findByUserAndSomeValue(currentUser, someValue)
if (obj) {
// yeah!!!
} else {
// boo!!
}
}
理想情况下,如果您正在为特定用户查找特定数据,ID并不是真正的解决方法。我不确定您是否可以在域级别执行此操作,但一种方法是使用筛选器。有一个过滤器插件可用于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的文档,正如其他答案所建议的那样,处理此类场景的方法有很多,但是,我认为一种正确的方法是使用和。ACL插件将深入到对象级别,帮助您控制
据
ACL插件为Grails添加了域对象安全支持
使用Spring安全性的应用程序。”
安全核心和ACL的结合可以帮助您完成所需的任务 SpringSecurity看起来仍然必须应用于每个服务或控制器方法。我希望有一些东西进入域/GORM层本身。你看过spring security acl插件吗?是的,我当然能做到-重点是在堆栈中放一些较低的东西,这样如果我做MyDomain.find(x)本身,我不会意外地拉别人的东西。