shiro讲解 之 Authorization (一)

来源:互联网 发布:女装淘宝代理加盟 编辑:程序博客网 时间:2024/06/05 14:50

shiro讲解之 Authorization(一)

本节我们将学习一下 Shiro 的 Authorization(授权)。


  • 官方文档

    • The Authorizer is the component responsible determining users’ access control in the application. It is the mechanism that ultimately says if a user is allowed to do something or not. Like the Authenticator, the Authorizer also knows how to coordinate with multiple back-end data sources to access role and permission information. The Authorizer uses this information to determine exactly if a user is allowed to perform a given action.
  • 通常理解

    • 也叫访问控制,即在应用中控制谁访问哪些资源(如访问页面/编辑数据/页面操作 等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)

      通常而言 Shiro 的授权功能指的是在我们的应用中通过调用 Authorization 方法来给当前的Subject 进行角色认定和 权限赋予。被授权了的角色就可以根据各自的权限访问系统内的不同资源了。


核心概念

  • 在 Shiro 的授权功能中我们要很清晰地理解 主体、角色、权限、资源 四个概念之前的耦合和内在关系。

  • 主体
    访问应用的用户,在 Shiro 中使用 Subject 代表该用户。用户只有授权后才允许访问相应的资源

  • 角色
    权限的集合,一般情况下会赋予用户角色而不是权限,即这样用户可以拥有 一组权限,赋予权限时比较方便。
    典型的如:项目经理、技术总监、CTO、开发工程师等 都是角色,不同的角色拥有一组不同的权限

  • 权限
    安全策略中的原子授权单位,通过权限我们可以表示在应用中用户有没有操作某个资源的权力。即权限表示在应用中用户能不能访问某个资源,如:访问用户列表页面查看/新增/修改/删除用户数据(即很多时候都是CRUD(增查改删)式权限控 制)等。权限代表了用户有没有操作某个资源的权利,即反映在某个资源上的操作允不允许。

    Shiro 支持粗粒度权限(如用户模块的所有权限)和细粒度权限(操作某个用户的权限,
    即实例级别的)

  • 资源
    在应用中用户可以访问的 URL,比如访问 JSP 页面、查看/编辑某些数据、访问某个业务方法、打印文本等等都是资源。用户只要授权后才能访问。

  • 关系图

    这里写图片描述

    • 在 Authorization Realm 中对 Subject 进行角色判断和自定义权限赋予。此处的 Subject 和 Role 的关系应该是多对多的关系模型。即一个主体可以被赋予多个角色。

    • 而对于权限和资源是根据我们自己的需求而高度自定义的。如项目经理、技术总监、开发工程师等角色和权限的设定。Role 和 Authority 的关系应该是多对多的 即 角色是权限的集合。

      这里写图片描述

    • 权限和资源的关系应是多对一的。在实际的项目中资源一定要是唯一的(从程序内部看)。


实例

我们以之前的项目为基本框架,然后编写授权代码。

  • 在Spring Context中配置 Shiro Filter 关于授权信息,代码如下

    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">    <property name="securityManager" ref="securityManager" />    <property name="loginUrl" value="/login/toLogin" />    <property name="successUrl" value="/example/index" />    <property name="unauthorizedUrl" value="/example/unauthorized" />    <property name="filterChainDefinitions">        <value>            /login/toLogin = anon            /login/loginVal = anon            /login/logout = logout            /example/admin =roles[admin]            /example/user = roles[user]            /** = authc        </value>    </property></bean>

    其中 /example/admin 和 /example/user 两个资源需要分别拥有 admin 和 user 角色才能获得。如果以上两个角色都没有的Subject 若要访问以上两个资源则将跳转至未授权页面即我们定义的 unauthorizedUrl

  • Controller 层代码

    import org.apache.shiro.SecurityUtils;import org.apache.shiro.subject.Subject;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;@Controller@RequestMapping("/example")public class Example {    @RequestMapping(value = "/index")    public String example() throws Exception {        return "example";    }    @RequestMapping(value="/unauthorized")     public String unauthorized(){        return "unauthorized";    }    @RequestMapping(value="/admin")    public String AuthorizationOne () {        Subject admin =SecurityUtils.getSubject();        System.out.println("角色" + admin.hasRole("admin"));        return "admin";    }    @RequestMapping(value="/user")    public String AuthorizationTwo(){        Subject admin =SecurityUtils.getSubject();        System.out.println("角色" + admin.hasRole("user"));      return "user";        }}
  • Realm 中 的 Authorization

    @Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {    System.out.println("MyRealm Authorization");    Object principal = principals.getPrimaryPrincipal();    Set<String> roles = new HashSet<>();    roles.add("admin");    SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(roles);    return info;}

    从 Subject 中获得主体Principle的信息,如果是Dustyone 则将主体的角色赋为 admin, 如果是 其他的则赋为 user。


结果

在对 Authprization 的测试中我们将 对 Dustyone/123456 的Principal 进行授权并测试相应的逻辑。(此处的Pincipal 角色的赋予是程雪写的,理论上应当在我们的后台程序中进行设置,在Shiro 的Authorization 高级部分我们再详细讲解)

  • 将Subject 赋予 admin 觉得

    • 访问 /example/admin 此资源已授权给了 admin 角色
      这里写图片描述

      这里写图片描述

    • 访问 /example/user 此资源未授权给 admin 角色
      这里写图片描述

      这里写图片描述


小结

  • Shiro 的 Autnorization 实现逻辑一般为:鉴定Subject ->给当前 Subject 赋予角色 -> 获得当前角色权限 ->访问资源是根据不同的角色权限做不同的限制。

  • Shiro 的 Authorization 的重点并不是我们如何使用它,而是那些需要我们自定义的 角色-权限-资源之间的关系。比如当前是一个由程序指定哪个主体被赋予什么角色,有权访问什么资源,而在实际的需求中 角色-权限-资源由往往是独立开来的,彼此的约束关系仅由内外键来体现,例如在我们添加一个角色后其权限和该权限应享有的资源因该随之生成而无需在配置文件重配置。

  • 充分理解 主体-角色-权限-资源 往往能让我们在设定 角色-权限-资源 环节有更优秀的解决方案和更全面的Shiro authorization 理解和体验。

原创粉丝点击