会员有很多工作。成员可以添加,删除或更新作业。目前,在控制器中定义了通过jQuery.ajax()调用的操作(添加,删除或更新)。我们正在发送job id和member id来执行操作。会员ID是必要的,因为有一个角色管理员可以代表成员修改作业,因此我们需要识别该成员。但是发送会员ID是危险的,因为任何人都可以通过修改会员ID来发送请求。
我知道,我们可以添加约束做限制只有管理员可以修改作业或者成员只能修改他的作业。我的问题是,我是否需要在控制器的操作中添加这些约束,或者是否有任何Grails方法可以做到这一点。我有谷歌,通过使用路由在Ruby和Rails中处理同样的事情。在grails中,我浏览了RESTful URL映射,它可能用于此目的。
任何人都可以指出我正确的方向,谢谢。我使用的是Grails 2.1.1。
答案 0 :(得分:2)
您可以实现AbstractPersistenceEventListenerService
的某些实现,以允许对使用未登录用户的id的实体执行操作。例如:
class MultiTenantPersistenceEventListenerService extends AbstractPersistenceEventListenerService {
def springSecurityService
@Override
protected AbstractPersistenceEventListener createPersistenceEventListener(Datastore datastore) {
return new MultiTenantPersistenceEventListener(datastore)
}
}
class MultiTenantPersistenceEventListener extends AbstractPersistenceEventListener {
MultiTenantPersistenceEventListener(final Datastore datastore) {
super(datastore)
}
@Override
protected void onPersistenceEvent(AbstractPersistenceEvent event) {
def entity = event.getEntityObject() // could be your Job domain entity
def user = springSecurityService.getCurrentUser() //current logged in user
if(entity.hasProperty('userId')){ // every job belongs to User
if(entity.userId != user.id){
throw new AccessDeniedException("Acces Denied !")
}
}
}
}
答案 1 :(得分:1)
我建议使用grails spring-security-plugin 。网络上有很多关于插件的信息,它很容易配置。插件允许您以安全的方式执行控制器的操作。例如:
@Secured(['ROLE_USER'])
def followAjax = { ... }
@Secured(['IS_AUTHENTICATED_REMEMBERED'])
def personal = { ... }
有关详情,请访问plugin和spring-security with grails。
答案 2 :(得分:0)
您可以使用“授权”属性来授权用户, e.g
[CustomAuthorize(Roles=SiteRoles.Admin|SiteRoles.HelpDesk)]
public ActionResult Index()
{
return View();
}
这是一种使网站安全的好方法。
通过这些链接,这将对您有所帮助。