1

我在我的应用程序中安装了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()

现在我要创建一个 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 的所有操作

4

2 回答 2

1

不知道如何使用纯 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
                }

            }
        }
    }
}
于 2013-08-26T11:19:50.543 回答
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的直接权限。

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

我希望这有帮助...

于 2013-08-27T06:54:30.133 回答