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

时间:2013-08-26 07:46:21

标签: grails shiro

我在我的application.i中安装了shiro插件,为角色分配了一个完整的控制器:'role_developer'..所以如果任何用户都在role_developer下,他可以访问该控制器的所有操作..但是在这里我要删除两个动作controller..so请建议我..

这里我的代码是:

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()

现在我要创建一个ROLE_DEVELOPER用户,并为人员控制器分配权限:创建,仅列表

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的所有操作

2 个答案:

答案 0 :(得分:1)

不知道如何使用纯shiro API执行此操作,但可以使用grails filters

来完成

像这样的东西

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
                }

            }
        }
    }
}

答案 1 :(得分:0)

您不需要过滤器。 :-)

我从未使用过

shiroRole.addToPermission('Person')

但是根据你的问题,我猜这等于

shiroRole.addToPermission('Person:*')

授予角色所有者访问Person控制器的所有操作。

现在,您似乎希望通过为此特殊用户分配权限来删除其中一个用户的某些权限。但这不是它的工作方式。 AFAIK,没有办法删除权限,这没关系,因为它更安全......

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:listPerson:show,并可以从他的直接权限访问Person:createPerson:save

正如您所看到的,大多数情况下,使用角色并避免使用直接权限就足够了。

我希望这会有所帮助......