我在项目中使用Grails安全性插件。我正在使用控制器操作上的注释来限制对某些类用户的访问,例如“ROLE_ADMIN”或“ROLE_USER”。
我的问题是,如何限制操作,以便用户只能看到有关自己的信息。例如,假设我有一个id = 1的用户。如果我有一个显示用户信息的操作:
mySite/User/Show/1
如何阻止id = 1的同一用户访问
mySite/User/Show/2
?有一种简单的方法可以做到这一点吗?
答案 0 :(得分:1)
以下是什么问题?:
class SomeController {
springSecurityService
// other stuf ...
def show () {
User user = User.get(params)
User logged = User.get(springSecurityService.principal.id)
if (user.id != logged.id) {
flash.message = "You can't see the profile of other users"
redirect action:"list" // You can redirect to other controller/action
return //Since grails 2 this is needed
}
// Logic for display your user
}
// other stuf ...
}
答案 1 :(得分:1)
如果要将相同的逻辑应用于多个操作,也可以使用Grails控制器拦截器
class SomeController {
def beforeInterceptor = [action: this.&checkUser ]
def springSecurityService
def checkUser() {
User user = User.get(params)
User logged = User.get(springSecurityService.principal.id)
if (user.id != logged.id) {
{
redirect(action: "accessDenied", controller='access' id: params.long("id")) //re-direct accessDenied page
return false
}
return true;
}
}
Class AccessController{
def accessDenied= {
render(view: "accessDenied")
}
}
答案 2 :(得分:0)
您所询问的是您的业务规则的一部分。因此,您应该在代码中处理这些场景,而不是寻找一些插件或帮助程序代码。
您可以为此做的是,确保访问用户详细信息的用户的ID与正在质疑其详细信息的用户的ID相同。
您也可以在对象级别进行此检查,但这将意味着对数据库进行额外查询以获取用户详细信息。
希望这有帮助。
答案 3 :(得分:0)
我必须同意您正在尝试实施具有安全性方面的业务规则。如果用户创建了某种文档,您就不会使用授权来选择其个人资料页面上显示的内容,是吗?
您必须在授权方面到达的位置和业务规则的开始位置划一条线。
根据我的经验,为了避免模糊线条,我总是使用授权角色作为与一组功能相关联的用户类型。特定用户类型可以访问一系列故事或用例。这些用例受限于特定角色。
如果您开始询问有关数据可见性的问题(页面上隐藏的内容,具体取决于任何业务因素),那么您应该清楚自己的安全框架
答案 4 :(得分:0)
我不同意您需要重新定义业务逻辑与安全逻辑。这是一个常见的用例,授权应该涵盖它。这就是Grails有过滤器的原因。使用授权过滤器添加如下功能:
class AuthorizationFilters {
def filters = {
userCheck(controller: 'user', action: '*') {
before = {
// Check current user id is param.id here
}
}
}
}
因此,您的安全逻辑位于控制器之外。您可以添加其他控制器,如果它们传入用户ID,或者甚至是其他方法,以检查当前用户是否拥有域类。