grails中的用户访问控制

grails中的用户访问控制,grails,user-permissions,Grails,User Permissions,我对Grails完全陌生,也读过一些关于Shiro插件的书,但我不确定这是我想要的,所以希望有人能给我指出正确的方向 在我计算机科学的最后一年项目中,我正在创建用Grails编写的在线团队协作工具。应用程序的结构如下所示: 应用程序-有许多公司在使用它 公司有很多项目 项目有很多用户等 我确保当用户登录时,如果他们是管理员,他们只能看到公司和项目的内容,或者如果他们是普通用户,他们只能看到项目的内容,最好的方法是什么。显然,我不希望一家公司的用户能够访问其他公司的项目信息等 非常感谢您的帮助。一

我对Grails完全陌生,也读过一些关于Shiro插件的书,但我不确定这是我想要的,所以希望有人能给我指出正确的方向

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

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

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


非常感谢您的帮助。

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

我建议将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)
                }
            } 
        }
    } 
}
或者,您可以实现自己的
权限
,并使用
SecurityUtils.subject.ispermited()

最佳实施取决于应用程序的体系结构。如果你需要更多帮助,你必须提供你的应用程序的更多细节


希望有帮助

一般来说,有很多方法可以确保你想要的行为

我建议将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)
                }
            } 
        }
    } 
}
或者,您可以实现自己的
权限
,并使用
SecurityUtils.subject.ispermited()

最佳实施取决于应用程序的体系结构。如果你需要更多帮助,你必须提供你的应用程序的更多细节


希望有帮助

谢谢你的帮助,请问你的服务是什么样的?它会像SpringSecurityService.getCurrentUser()一样吗?永远不要使用您自己的安全性—错误的风险太大。Spring Security和Shiro非常易于设置和使用。
accessControl
闭包不是Shiro提供的一种保护方式吗?我试过你的例子,但它删除了在每个控制器和操作上强制执行的默认权限。我使用默认Shiro访问控制的问题是,根据我收集的信息,如果用户有权访问
公司1
,权限将设置为
公司:::1
,但如果我有第二个用户,
用户2
,他是
公司2
的一部分,我以
user 1
的身份登录,我希望有权限阻止我访问URL
user\view\2
有关此的更多帮助吗?我仍然不知道如何在保持公司内容彼此独立的同时实现权限,同时希望保留默认的
accessControl
谢谢您的帮助,请问您的服务会是什么样的?它会像SpringSecurityService.getCurrentUser()一样吗?永远不要使用您自己的安全性—错误的风险太大。Spring Security和Shiro非常易于设置和使用。
accessControl
闭包不是Shiro提供的一种保护方式吗?我试过你的例子,但它删除了在每个控制器和操作上强制执行的默认权限。我使用默认Shiro访问控制的问题是,根据我收集的信息,如果用户有权访问
公司1
,权限将设置为
公司:::1
,但如果我有第二个用户,
用户2
,他是
公司2
的一部分,我以
user 1
的身份登录,我希望有权限阻止我访问URL
user\view\2
有关此的更多帮助吗?我仍然不确定如何在保持公司内容彼此独立的同时实现权限,同时希望保留默认的
accessControl