【问题标题】:Grails + RESTful URL mapping + Filters + RoutesGrails + RESTful URL 映射 + 过滤器 + 路由
【发布时间】:2013-12-01 15:57:31
【问题描述】:

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

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

谁能指出我正确的方向,谢谢。我正在使用 Grails 2.1.1。

【问题讨论】:

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


    【解决方案1】:

    您可以实现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 !")   
                }
             }
        }
    }
    

    【讨论】:

    • 这是一些有趣的东西,我目前正在尝试 SPEL 表达式。也会试试的。
    【解决方案2】:

    我建议使用 grails spring-security-plugin。网络上有很多关于插件的信息,而且很容易配置。插件允许您以安全的方式执行控制器的操作。例如:

    @Secured(['ROLE_USER'])
    def followAjax = { ... }
    
    @Secured(['IS_AUTHENTICATED_REMEMBERED'])
    def personal = { ... }
    

    更多信息 - pluginspring-security with grails

    【讨论】:

    • 我可以在角色的情况下添加方法吗?例如@Secured(['checkSecured()'])
    • 没有。您应该为用户添加相应的角色以允许他执行某些操作,然后通过控制器中的注释检查该角色。 UserRole 表中定义的所有角色,因此您可以轻松添加新角色。
    • 为每个用户添加新角色以执行操作,将增加 UserRole 表中的行数。例如,如果我在登录时给用户一个角色,如 ROLE_12USERID,那么为每个用户执行此操作将增加 UserRole 表的大小。你说什么?
    • 不。您可以为许多用户添加相同的角色。每个用户可以有多个角色。
    • 但这并不能解决问题,会员仍然可以删除其他工作。
    【解决方案3】:

    您可以使用 Authorize 属性来授权用户, 例如

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

    这是确保网站安全的好方法。

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

    custom authorization with asp.net mvc

    asp.net mvc authorization

    【讨论】:

    • 亲爱的,我正在使用 grails。感谢您的回复。
    • 哎呀抱歉。我错过了。
    猜你喜欢
    • 2018-06-14
    • 2011-04-10
    • 1970-01-01
    • 2012-07-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    相关资源
    最近更新 更多