Grails with Shiro-如何为特定用户分配特定权限,即使他拥有基于角色的权限

Grails with Shiro-如何为特定用户分配特定权限,即使他拥有基于角色的权限,grails,shiro,Grails,Shiro,我在我的应用程序中安装了shiro插件。我为角色分配了一个完整的控制器:'role_developer'。因此,如果任何用户在role_developer下,他都可以访问该控制器的所有操作。但在这里,我想删除该控制器的两个操作。因此,请建议我 我的代码是: def shiroRole = new ShiroRole() shiroRole.name='ROLE_DEVELOPER'// create role as role developer shiroROle.addToPermission

我在我的应用程序中安装了shiro插件。我为角色分配了一个完整的控制器:'role_developer'。因此,如果任何用户在role_developer下,他都可以访问该控制器的所有操作。但在这里,我想删除该控制器的两个操作。因此,请建议我

我的代码是:

def shiroRole = new ShiroRole()
shiroRole.name='ROLE_DEVELOPER'// create role as role developer
shiroROle.addToPermission('Person') //assigned permissions Person controller with all actionss
shiro.save()
现在我将创建一个角色开发者的用户,并为一些操作分配权限,如person controller:create,list only

def shiroUser = new ShiroUser()
shiroUser.username='username'
shiroUser.passwordHash= new Sha256Hash("password").toHex()
shiroUser.addToRoles(ShiroRole.findByName('ROLE_DEVELOPER')
        newUser.addToPermissions('person:list,create')
                newUser.save()

所以在这里,shiroUser不应该访问分配给role_dveloper的所有操作。我不知道如何使用纯shiro API来实现这一点,但可以使用grails来实现

像这样的

import org.apache.shiro.SecurityUtils
import org.apache.shiro.subject.Subject


class ProjectFilters {
    def filters = {
        all(controller: 'Person', action: '*') {
            before = {
                Subject subject = SecurityUtils.getSubject()

                //boolean hasRole = subject.hasRole('ROLE_DEVELOPER')
                //boolean hasPermission = subject.isPermitted('Person')

                if (/*your logic here*/) {
                    redirect(uri: '/access-denied')
                    return false
                }

            }
        }
    }
}

我不知道如何使用纯shiro API实现这一点,但可以使用grails实现

像这样的

import org.apache.shiro.SecurityUtils
import org.apache.shiro.subject.Subject


class ProjectFilters {
    def filters = {
        all(controller: 'Person', action: '*') {
            before = {
                Subject subject = SecurityUtils.getSubject()

                //boolean hasRole = subject.hasRole('ROLE_DEVELOPER')
                //boolean hasPermission = subject.isPermitted('Person')

                if (/*your logic here*/) {
                    redirect(uri: '/access-denied')
                    return false
                }

            }
        }
    }
}
您不需要过滤器。:-)

我从来没用过

shiroRole.addToPermission('Person')
但从你的问题来看,我想这等于

shiroRole.addToPermission('Person:*')
允许角色所有者访问Person controller的所有操作

您现在似乎希望通过将权限分配给此特殊用户来删除其中一个用户的某些权限。但事实并非如此。好了,没有办法删除权限,这没关系,因为它更安全

Shiro的工作方式如下:

a:b
这样的权限允许用户访问控制器
a
和操作
b
。角色是权限的集合。权限是可添加的

所以如果你创建一个角色

def shiroRole = new ShiroRole()
shiroRole.name='ROLE_USER'// create role as role developer
shiroRole.addToPermission('Person:list,show') //assigned permissions Person controller with all actionss
shiroRole.save()
和一个用户

def shiroUser = new ShiroUser()
shiroUser.username='username'
shiroUser.passwordHash= new Sha256Hash("password").toHex()
shiroUser.addToRoles(ShiroRole.findByName('ROLE_USER')
shiroUser.addToPermissions('person:create,save')
shiroUser.save()
此用户将有权从分配的角色访问
Person:list
Person:show
,从其直接权限访问
Person:create
Person:save

如您所见,大多数情况下,使用角色和避免使用直接权限就足够了

我希望这有帮助…

您不需要过滤器。:-)

我从来没用过

shiroRole.addToPermission('Person')
但从你的问题来看,我想这等于

shiroRole.addToPermission('Person:*')
允许角色所有者访问Person controller的所有操作

您现在似乎希望通过将权限分配给此特殊用户来删除其中一个用户的某些权限。但事实并非如此。好了,没有办法删除权限,这没关系,因为它更安全

Shiro的工作方式如下:

a:b
这样的权限允许用户访问控制器
a
和操作
b
。角色是权限的集合。权限是可添加的

所以如果你创建一个角色

def shiroRole = new ShiroRole()
shiroRole.name='ROLE_USER'// create role as role developer
shiroRole.addToPermission('Person:list,show') //assigned permissions Person controller with all actionss
shiroRole.save()
和一个用户

def shiroUser = new ShiroUser()
shiroUser.username='username'
shiroUser.passwordHash= new Sha256Hash("password").toHex()
shiroUser.addToRoles(ShiroRole.findByName('ROLE_USER')
shiroUser.addToPermissions('person:create,save')
shiroUser.save()
此用户将有权从分配的角色访问
Person:list
Person:show
,从其直接权限访问
Person:create
Person:save

如您所见,大多数情况下,使用角色和避免使用直接权限就足够了

我希望这有助于