grails中的用户访问控制

Posted

技术标签:

【中文标题】grails中的用户访问控制【英文标题】:User access control in grails 【发布时间】:2012-11-24 11:40:48 【问题描述】:

我对 Grails 完全陌生,并且已经阅读了 Shiro 插件,但我不确定这是我所追求的,所以希望有人能指出我正确的方向。

对于我最后一年的计算机科学项目,我正在创建用 Grails 编写的在线团队协作工具。该应用程序的结构如下:

应用程序 - 有许多公司使用它 公司有很多项目 项目有很多用户等。

我确保当用户登录时,如果他们是管理员,他们只能看到他们公司和项目的内容,或者如果他们是普通用户,则只能看到他们的项目的最佳方式是什么。显然我不希望一家公司的用户能够访问其他公司的项目信息等。

非常感谢任何帮助。

【问题讨论】:

【参考方案1】:

一般来说,有很多方法可以确保您的期望行为。

我建议将 shiro 与标准 grails 过滤器结合使用:

class SecurityFilters 
    def filters = 
        all(uri: "/**") 
            before = 
                // Ignore direct views (e.g. the default main index page).
                if (!controllerName) return true

                accessControl 
                    // add your logic here to determine if user has access or not
                    // return true if user has access, false otherwise

                    // get current user
                    def user = yourService.getCurrentUser()
                    // get projects the user is allowed to access
                    def projects = yourService.getProjectsOfUser(user)
                    // get the project the user tries to access
                    def currentProject = Project.get(params.projectId)

                    // is current project in list of permitted projects?
                    return project.contains(currentProject)
                
             
        
     

您也可以实现自己的Permission 并使用SecurityUtils.subject.isPermitted()

最佳实现取决于您应用的架构。如果您需要更多帮助,您必须提供有关您的应用的更多详细信息。

希望对您有所帮助!

【讨论】:

感谢您的帮助,请问 yourService 的示例是什么?会是 SpringSecurityService.getCurrentUser() 之类的吗? 永远不要使用自己的安全性 - 出错的风险太大。 Spring Security 和 Shiro 非常易于设置和使用。 accessControl闭包不是Shiro提供的一种保护方式吗? 我尝试了您的示例,但它删除了对每个控制器和操作强制执行的默认权限。我使用默认 Shiro 访问控制的问题是,据我所知,对于有权访问 company 1 的用户,权限将设置为 company:*:1,但如果我有第二个用户 user 2 company 2 的一部分,我以 user 1 登录我希望权限阻止我访问 URL user\view\2 对此还有什么帮助吗?我仍然不确定如何实现将公司内容彼此分开的权限,同时希望保留默认的accessControl

以上是关于grails中的用户访问控制的主要内容,如果未能解决你的问题,请参考以下文章

从 Grails 中的过滤器定义控制器可访问变量

Grails with SpringSecurity,检查当前用户是不是可以访问控制器/动作

Grails 检查特定控制器操作的角色访问

如何从 Grails 中的控制器访问域属性?

Grails Spring Security UI、用户和​​角色管理访问

在过滤器中访问 request.JSON 后 Grails 2.5.0 控制器命令对象绑定