zoukankan      html  css  js  c++  java
  • shiro:入门(概念、RBAC模型、入门程序)

    1、shiro概念

    (1)相关概念

    项目中的密码是用密文存储的,不是明文,否则,会造成安全问题。

    不同的功能需要不同的权限,不是所有的人都能访问相应的功能。

    只有登录才能进入系统正常使用。

    (2)shiro

    Apache Shiro是一个功能强大且易于使用的Java安全框架,它执行身份验证,授权,加密和会话管理。使用Shiro易于理解的API,您可以快速轻松地保护任何应用程序-从最小的移动应用程序到最大的Web和企业应用程序。

    摘自:shiro官网http://shiro.apache.org/

    (3)工作流程

     subject:用户代码直接交互的对象,subject代表当前用户,对外API的核心,subject将所有的交互都为你托给securityManager

    securityManager:所有的安全有关的操作都会与securityManager交互,它管理着所有的subject且负责与shiro的其它组件进行交互,是shiro的核心

    realm:shiro从realm获取安全数据(用户、权限),当securityManager要验证用户身份的时候,要从realm获取相应的用户进行比较,以确定相应的用户是否合法,呀需要获得用户的相应的角色或权限进行验证,能否进行操作。

    2、RBAC模型(Role Base Access Control)

    (1)三个主题

    用户(zhai、张)、角色(辅导员、学生、院长)、权限

    3、Shiro入门程序

    (1)新建一个maven项目

    (2)导入依赖

     <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
        <dependency>
          <groupId>org.apache.shiro</groupId>
          <artifactId>shiro-core</artifactId>
          <version>1.4.0</version>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.5</version>
        </dependency>
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.17</version>
        </dependency>
        <dependency>
          <groupId>commons-logging</groupId>
          <artifactId> commons-logging</artifactId>
          <version>1.2</version>
        </dependency>
      </dependencies>

    (3)新建ini文件:

    [users]
    zhao=123,headmaster
    zhang=123,teacher
    zhai=123,student
    
    [roles]
    headmaster=*
    teacher=user:query,user:detail:query
    student=query
    stu=user:query,user:insert
    //可以简写为
    stu="user:query,insert"
    //实例级别权限标识
    user:update:1,user:update:1
    //可以简写为
    "user:update,delete:1"

    (4)安装Ini插件

    (5)用户登录状态:

    public class ShiroTest {
        public static void main(String[] args) {
          Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
          //获得了Shiro的核心:SecurityManager
          SecurityManager securityManager=factory.getInstance();
          //将SecurityManager托管到SecurityUtils工具类中(之后可以不必再关心SecurityManager,可以简化操作)
          SecurityUtils.setSecurityManager(securityManager);
          //获取subject,直接由用户使用,每个用户独享,通过subject可以执行Shiro的相关操作(加密除外)
          Subject subject=SecurityUtils.getSubject();
          //通过subject获取当前用户的登录状态(从session中同步信息)
          System.out.println(subject.isAuthenticated());
          //通过subject进行身份认证,只要不抛出异常就是成功的
          UsernamePasswordToken usernamePasswordToken=new UsernamePasswordToken("zhai","123");
          subject.login(usernamePasswordToken);
          System.out.println(subject.isAuthenticated());
        }
    }

    如果没有异常就代表用户已经登录

    false
    true

    (6)身份认证、角色校验、权限校验:

    public class ShiroTest {
        public static void main(String[] args) {
          Factory<SecurityManager> factory=new IniSecurityManagerFactory("classpath:shiro.ini");
          //获得了Shiro的核心:SecurityManager
          SecurityManager securityManager=factory.getInstance();
          //将SecurityManager托管到SecurityUtils工具类中(之后可以不必再关心SecurityManager,可以简化操作)
          SecurityUtils.setSecurityManager(securityManager);
          //获取subject,直接由用户使用,每个用户独享,通过subject可以执行Shiro的相关操作(加密除外)
          Subject subject=SecurityUtils.getSubject();
          //身份认证
            if(!subject.isAuthenticated()){
                UsernamePasswordToken token=new UsernamePasswordToken("zhai","123");
                try {
                    subject.login(token);
                }catch (UnknownAccountException uas){
                    System.out.println("用户名不存在"+token.getPrincipal());
                }catch (IncorrectCredentialsException ice){
                    System.out.println("密码错误"+token.getPrincipal());
                }catch (LockedAccountException lae){
                    System.out.println("账户冻结"+token.getPrincipal());
                }
            }
            System.out.println("用户凭证"+subject.getPrincipal()+"登录成功");
            //角色校验&权限校验
            if(subject.hasRole("student")){
                System.out.println(subject.getPrincipal()+"同学你好");
            }else{
                System.out.println("你好");
            }
    
            if(subject.isPermitted("query")){
                System.out.println("拥有查询权限");
            }else {
                System.out.println("对不起,您没有查询权限");
            }
            //清除用户的相关信息
            subject.logout();
        }
    }
  • 相关阅读:
    [][]
    Spark笔记04
    Spark笔记03
    Spark笔记02
    Spark笔记01
    【熟能生巧】使用Screw快速生成数据库文档
    记一次关于jdbcTemplate.queryForList快速Debug及感悟
    【从零单排】Exception实战总结1
    【从零单排】Java性能排查实战模拟
    【从零单排】关于泛型Generic的一些思考
  • 原文地址:https://www.cnblogs.com/zhai1997/p/13253085.html
Copyright © 2011-2022 走看看