在grails中基于角色的域类字段访问
问题描述:
我正在开发Grails应用程序。在这种情况下,我想根据角色控制域类字段。所以在每次调用getter setter方法的域类时我都想要应用一些基于角色的过滤器(登录用户的角色)。我假设grails会在运行时为占优的类创建getter setter方法。因此,在编写grails代码时可以应用这种逻辑。如果可能,那么如何应用?在grails中基于角色的域类字段访问
实施例:
域类:
class Book{
String name;
double price;
}
控制器:
def index={
Book book=Book.get(1);
println book.name;
println book.price;
}
在上面的代码 “的println book.price;”这条线只适用于特定的角色。对于其他角色,它应该抛出一些异常。
有没有可能实现?有没有插件可以做到这一点?
请给一些这方面的帮助....谢谢
答
您可以创建要控制访问,把你的安全逻辑的属性外get/set方法。假设你写你自己的安全服务或使用的安全插件,如春季安全(的Acegi)插件,你会:
class Book{
String name;
double price;
def authenticateService
void setPrice(double price) {
if(!authenticateService.ifAllGranted('ROLE_PRICE_FIXER')) {
throw new Exception("You are not authorized to set book prices")
}
this.price = price
}
double getPrice() {
if(!authenticateService.ifAllGranted('ROLE_PRICE_FIXER')) {
throw new Exception("You are not authorized to get book prices")
}
return this.price
}
}
我不知道任何插件,允许访问控制要在域属性放。
答
您也可以考虑使用自定义验证器或弹簧错误对象来捕获在保存之前设置字段的尝试。
编辑:这是我在想什么的例子。你可以概括更多一点,这里的代码还没有经过测试,所以它可能不会按原样运行。
class securedDomain {
String securedField
def fieldSetBy = [:]
def previousValue = [:]
static transients = ['fieldSetBy', 'previousValue']
static constraints = {
securedField(validator: { v, o ->
def access = User.findByName(fieldSetBy['securedField']).hasAccess('securedField')
if(!access) securedField = previousValue['securedField']
return access
})
void setProperty(String name, value) {
if(name == "securedField") {
fieldSetBy['securedField'] = session.user
previousValue['securedField'] = securedField
securedField = value
} else {
super(name, value)
}
}
您能否提供一些示例代码。 – DonX 2010-02-16 02:53:30
当然,我编辑了这篇文章,给我一个我在想什么的样本。 – Blacktiger 2010-02-16 15:27:29