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();
    }
}
原文地址:https://www.cnblogs.com/zhai1997/p/13253085.html