zoukankan      html  css  js  c++  java
  • 细说shiro之一:shiro简介

    官网:https://shiro.apache.org/

    一. Shiro是什么
    Shiro是一个Java平台的开源权限框架,用于认证和访问授权。具体来说,满足对如下元素的支持:

    • 用户,角色,权限(仅仅是操作权限,数据权限必须与业务需求紧密结合),资源(url)。
    • 用户分配角色,角色定义权限。
    • 访问授权时支持角色或者权限,并且支持多级的权限定义。

    Q:对组的支持?
    A:shiro默认不支持对组设置权限。

    Q:是否可以满足对组进行角色分配的需求?
    A:扩展Realm,可以支持对组进行分配角色,其实就是给该组下的所有用户分配权限。

    Q:对数据权限的支持? 在业务系统中定义?
    A:shiro仅仅实现对操作权限的控制,用于在前端控制元素隐藏或者显示,以及对资源访问权限进行检查。数据权限与具体的业务需求紧密关联,shiro本身无法实现对数据权限的控制。

    Q:动态权限分配?
    A:扩展org.apache.shiro.realm.Realm,支持动态权限分配。

    Q:与Spring集成?
    A:可以支持与Spring集成,shiro还支持jsp标签。


    二. 系统架构

    在shiro架构中,有3个最主要的组件:Subject,SecurityManager,Realm。
    Subject本质上就是当前访问用户的抽象描述。
    SecurityManager是Shiro架构中最核心的组件,通过它可以协调其他组件完成用户认证和授权。实际上,SecurityManager就是Shiro框架的控制器。
    Realm定义了访问数据的方式,用来连接不同的数据源,如:LDAP,关系数据库,配置文件等等。


    三. 如何使用Shiro
    Shiro作为一个完善的权限框架,可以应用在多种需要进行身份认证和访问授权的场景,例如:
    1. 在独立应用中使用shiro
    https://www.cnblogs.com/dousnl/p/9629085.html 细说shiro之三:在独立应用中使用shiro

    2. 在web应用中使用shiro
    https://www.cnblogs.com/dousnl/p/9629145.html 细说shiro之四:在web应用中使用shiro

    3. 在spring框架中集成shiro
    https://www.cnblogs.com/dousnl/p/9629186.html 细说shiro之五:在spring框架中集成shiro

    四. Shiro原理
    1. 认证
    通过调用Subject.login(token)方法开始用户认证流程。

    Subject currentUser = SecurityUtils.getSubject();
    UsernamePasswordToken token = new UsernamePasswordToken(username, password);
    token.setRememberMe(true);
    try {
      currentUser.login(token);
    } catch (UnknownAccountException e) {
      logger.error(String.format("user not found: %s", username), e); // 用户不存在
    } catch (IncorrectCredentialsException e) {
      logger.error(String.format("incorrent credentials: %s", username), e); // 密码不正确
    } catch (ConcurrentAccessException e) {
      logger.error(String.format("user has been authenticated: %s", username), e); // 用户重复登录
    } catch (AccountException e) {
      logger.error(String.format("account except: %s", username), e); // 其他账户异常
    }

    shiro用户认证时序图:

    2. 授权
    shiro访问授权有3种实现方式:api调用,java注解,jsp标签。
    (1)在独立应用程序中访问授权通过api调用实现

    String role = "schwartz";
    Subject currentUser = SecurityUtils.getSubject();
    if(currentUser.hasRole(role)) {
      //用户属于角色schwartz
    }else{
      //用户不属于角色schwartz
    }

    (2)在spring框架中可以通过java注解

    @RequiresPermissions(value={"log:manage:*"})
    public ModelAndView home(HttpServletRequest req) {
      ModelAndView mv = new ModelAndView("home");
      return mv;
    }

    (3)在JSP页面中还可以直接使用jsp标签

    <!-- 使用shiro标签 -->
    <shiro:hasPermission name="log:manage:*">
      <a href="<%=request.getContextPath()%>/user/home">操作日志审计</a><br/>
    </shiro:hasPermission>

    shiro访问授权时序图:

    五. 注意事项
    1.org.apache.shiro.realm.jdbc.JdbcRealm如果需要在授权时开启权限检查,必须设置permissionsLookupEnabled为true,否则只检查角色。
    2.用户退出登录时,Shiro用户必须执行logout(),必须要注销Session信息,避免影响下一次用户认证和授权。

    SecurityUtils.getSubject().logout();
    req.getSession().invalidate();

    3.如果在数据库中存储的用户密码为编码值(如MD5加密),则在发送登录请求时传递的密码参数也必须是MD5加密结果,否则认证失败。
    4.shiro框架只能控制操作权限,不能控制数据权限。数据权限与具体的业务紧密关联,无法通过一个通用的框架完成,通常都是利用关系数据库查询过滤实现。
    对操作权限的控制有2层含义,其一:用户在前端只能看到对应权限的元素;其二:在后端对用户操作进行权限检查。

  • 相关阅读:
    centos安装docker-compose
    CentOS安装Docker
    【JPA】【笔记】GenerationType四中类型
    【maven】多个子项目、父项目之间的引用问题【转】
    一个页面多个echarts图表自适应
    jQuery操作单选按钮(radio)用法
    CASE WHEN .... THEN END 的用法
    遮罩层
    oracle 数据库的字段的增删改主键设定删除
    自动获取ROI-用于SFR算法的ROI获取
  • 原文地址:https://www.cnblogs.com/dousnl/p/9604728.html
Copyright © 2011-2022 走看看