【问题标题】:Grails with Shiro - How to assign specifice permission to perticular user even he has role based permissionGrails with Shiro - 即使他具有基于角色的权限,如何为特定用户分配特定权限
【发布时间】:2013-08-28 15:32:51
【问题描述】:

我在我的应用程序中安装了 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 的所有操作

【问题讨论】:

    标签: grails shiro


    【解决方案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
                    }
    
                }
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      您不需要过滤器。 :-)

      我没用过

      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

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

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

      【讨论】:

        猜你喜欢
        • 2020-05-14
        • 2020-12-17
        • 2019-01-26
        • 1970-01-01
        • 1970-01-01
        • 2014-05-18
        • 2017-11-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多