2021-11-22最适合入门的Shiro框架教程(一)(权限管理,核心组件,认证流程,基于JavaSE应用)

一、引入案例《汽车销售管理系统》

 

基于主页的权限管理(不同用户)

适用于权限管理比较单一,用户少,每类用户权限固定

基于用户和权限的权限管理

可以实现权限的动态分配,但是不够灵活,不适合多个重复角色,

用户表--》用户权限表--》系统权限表(基础三张表  )

二、RBAC权限设计(五张表

        基于角色的访问控制(Role-Based Access  Control)

角色表

角色ID 角色名称 
r001 销售人员
r002 仓管人员

用户角色表

用户ID 角色ID
1r001 
2r002 

用户权限表,可以通过权限直接授予,不想通过角色授予!!

 三、Shiro安全框架简介

3.1认证授权流程

认证:对用户的身份进行检查

授权:对用户的权限进行检查

3.2安全框架

帮助我们完成用户身份认证及权限检查功能框架

常用框架:

  • Shiro:Apache Shiro  强大的java安全框架,可以完成认证,授权,密码及会话管理,主要针对单体项目的权限管理
  • Spring Security:基于Spring的一个安全框架,依赖Spring
  • OAuth2:第三方授权登录
  • 自定义安全认证中心

 四、Shiro的工作原理

4.1Shiro的核心功能

 

 4.2Shiro的核心组件

Architecture

  •  Subject        当前待认证和授权的用户对象

  • Security Manager 通过Security Manager来进行内部实例的管理,并通过它来提供安全管理的各种服务。

  • Realms  相当于Shiro进行认证和授权的数据源,充当了Shiro与安全数据之间的桥梁或者连接器,也就是说,当对用户进行认证和授权验证时,Shiro会用应用配置的realm中查找用户以及权限信息。

 五、基于JavaSE应用-shiro的基本使用

5.1创建Maven项目

5.2导入Shiro依赖库

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-core</artifactId>
    <version>1.4.1</version>
</dependency>

5.3创建Shiro配置文件

        创建shiro.inl文件,完成用户、角色以及权限的配置

[user]
zhangsan=123456,seller
lisi=666666,ckmgr
admin=222222,admin

[roles]
admin=*
seller=order-add,order-del,order-list
ckmgr=ck-add,ck-del,ck-list

 5.4shiro基本使用

package com.qfedu.shiro;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.mgt.DefaultSecurityManager;
import org.apache.shiro.realm.text.IniRealm;
import org.apache.shiro.subject.Subject;

import java.util.Scanner;

public class TestShiro {
    public static void main(String[] args) {
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入账号");
        String username = scanner.nextLine();
        System.out.println("请输入密码");
        String password= scanner.nextLine();
        //创建安全管理器
        DefaultSecurityManager securityManager=new DefaultSecurityManager();
        //构造realm
        IniRealm iniRealm=new IniRealm("classpath:shiro.ini");
        //将realm设置给安全管理器
        securityManager.setRealm(iniRealm);
        //将安全管理器设置给SecurityUtils工作
        SecurityUtils.setSecurityManager(securityManager);
        Subject subject = SecurityUtils.getSubject();
        //认证流程
        //a.将认证账号和密码封装到token对象中
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        //b.通过subject对象调用login方法进行认证申请
        boolean b=false;
        try {
            subject.login(token);
            b=true;
        }catch (IncorrectCredentialsException e){
            b=false;
        }
        System.out.println(b?"登录成功":"登录失败");

        //授权流程!!!
        //判断是否有角色
        System.out.println(subject.hasRole("seller"));
        //判断是否有权限
        System.out.println(subject.isPermitted("order-del"));

    }
}

六、shiro认证授权流程

账号和密码封装到Token中。

subject会调用login方法,需要token!!

SecurityManager——Authenticator(认证器)——iniRealm<<===shiro.ini安全信息

  1. 通过subject.login(token)进行登录,就会将token包含的用户信息(账号和密码)传递给安全管理器
  2. 安全管理器调用Authenticator认证器进行身份认证
  3. Authenticator把token传递给对应的Realm
  4. Realm根据得到的token,调用doGetAuthenticationInfo方法进行认证(如果认证失败通过抛出异常提示认证器) 
  5. 第五到第七步将校验结果一层一层返回!

不正确的凭证  IncorrectCredentialsException

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值