Grails + RESTful URL映射+过滤器+路由

时间:2013-11-18 13:20:11

标签: spring grails spring-security gorm grails-2.0

会员有很多工作。成员可以添加,删除或更新作业。目前,在控制器中定义了通过jQuery.ajax()调用的操作(添加,删除或更新)。我们正在发送job id和member id来执行操作。会员ID是必要的,因为有一个角色管理员可以代表成员修改作业,因此我们需要识别该成员。但是发送会员ID是危险的,因为任何人都可以通过修改会员ID来发送请求。

我知道,我们可以添加约束做限制只有管理员可以修改作业或者成员只能修改他的作业。我的问题是,我是否需要在控制器的操作中添加这些约束,或者是否有任何Grails方法可以做到这一点。我有谷歌,通过使用路由在Ruby和Rails中处理同样的事情。在grails中,我浏览了RESTful URL映射,它可能用于此目的。

任何人都可以指出我正确的方向,谢谢。我使用的是Grails 2.1.1。

3 个答案:

答案 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 = { ... }

有关详情,请访问pluginspring-security with grails

答案 2 :(得分:0)

您可以使用“授权”属性来授权用户, e.g

[CustomAuthorize(Roles=SiteRoles.Admin|SiteRoles.HelpDesk)]
public ActionResult Index()
{
    return View();
}

这是一种使网站安全的好方法。

通过这些链接,这将对您有所帮助。

custom authorization with asp.net mvc

asp.net mvc authorization