安全校验和框架---JWT和Shrio

news2024/11/28 20:59:48

安全架构

加密

分类

  • 可逆加密和不可逆加密
    • 不可逆加密:常见的不可逆加密算法有MD5,HMAC,SHA1、SHA-224、SHA-256、SHA-384,和SHA-512,其中SHA-224、SHA-256、SHA-384;
  • 可逆加密分为对称加密和非对称加密
    • 通过密钥进行加密;
    • 对称加密加密和解密使用同一个密钥,使用该密钥可以获取原密码;
    • 非对称加密加密通过公钥,解密通过私钥;公钥可以公开给别人进行加密,私钥永远在自己手里,非常安全,黑客拦截也没用,因为私钥未公开。著名的RSA加密算法用的就是非对称加密。

JWT

https://blog.csdn.net/weixin_45070175/article/details/118559272

  • JWT(JSON Web Token)是一种常用的非对称加密规范

  • JWT组成头部、负载、签名三部分组成,所以标准jwt格式为:xxx.zzz.yyyyyyy

    • 1.头部(Base64加密成字符串):描述jwt的基本信息;包括typ、alg
      {
      	'typ':'JWT'      #类型
      	'alg':'HS256'    #算法
      }
      2.负载(Base64加密成字符串):存放有效信息的部分,一般携带时间以方便验证token是否过期失效;
      3.签名(通过头部的加密算法进行组合加密):头部(Base64加密成字符串)、负载(Base64加密成字符串)加上盐(secret)组合加密成为的第三部分;由于只有盐是服务器自定义的,所以一定要保密盐,防止客户端自己创建jwt;
      
    • image-20220324165218088
  • 类型:

    • nonsecure JWT未经过签名,不安全的JWT;
    • JWS经过签名的JWT;
    • JWEpayload部分经过加密的JWT
  • java支持(jwt、jjwt等

    •     <dependency>
              <groupId>io.jsonwebtoken</groupId>
              <artifactId>jjwt</artifactId>
              <version>0.9.1</version>
          </dependency>
      
    • //对称加密解密
      	//加密
      @Test
          void contextLoads() {
              JwtBuilder jwtBuilder = Jwts.builder()
                  						//设置jti
                                          .setId("111")
                  						//设置签发事件
                                          .setIssuedAt(new Date())
                  						//设置编码格式和盐
                                          .signWith(SignatureAlgorithm.HS256,"xxxx")
                  						//设置过期时间为1分钟后
                                          .setExpiration(new Date(live));
              //生成token
              String token = jwtBuilder.compact();
              System.out.println(token);
          }
      	//解密
       @Test
          void contextLoads() {
              Claims claims = Jwts.parser().setSigningKey("xxxx")//设置盐
                      .parseClaimsJws(token).getBody();//输入token
              System.out.println("id"+claims.getId()+"time"+claims.getIssuedAt());//解析数据
          }
      
      //非对称加密
      

JWT认证流程

在这里插入图片描述

Shrio

快速入门

基础知识

Shiro是一个强大且易用的Java安全框架,能够用于身份验证、授权、加密和会话管理。Shiro拥有易于理解的API,您可以快速、轻松地获得任何应用程序——从最小的移动应用程序到最大的网络和企业应用程序。

特点

  • 易于使用
  • 全面:不需要依赖其他框架,而且可以集成在其他框架上;
  • 灵活:可以在多种应用环境下使用,包括但不限于web和EJB等
  • 低耦合和web支持等
功能架构

preview

**Authentication(认证), Authorization(授权), Session Management(会话管理), Cryptography(加密)**被 Shiro 框架的开发团队称之为应用安全的四大基石。

  • Authentication:用户身份鉴别(即登录)
  • Authorization:访问控制(权限控制),比如某一个用户是否具有某一操作的使用权限
  • Session Management:特定用户的会话管理,可以用于单点登录等
  • Cryptography:在数据源处对于数据进行加密;

辅助功能支持

  • web Support:显然是对于web支持
  • caching:缓存是Apache Shiro API中的第一级,以确保安全操作保持快速和高效。
  • Concurrent:并发操作的支持
  • “记住我”和“以…运行”
组件架构

img

三大组件:Subject、Shiro SecurityManager、Realm

  • Subject当前用户,Subject 可以是一个人,但也可以是第三方服务、守护进程帐户、时钟守护任务或者其它–当前和软件交互的任何事件。
  • Shiro SecurityManager管理所有Subject,SecurityManager 是 Shiro 架构的核心,配合内部安全组件共同组成安全伞。
  • Realm用于进行权限信息的验证我们自己实现。**Realm 本质上是一个特定的安全 DAO:它封装与数据源连接的细节,得到Shiro 所需的相关的数据。**在配置 Shiro 的时候,你必须指定至少一个Realm 来实现认证(authentication)和/或授权(authorization)。

认证的过程

图片

  • 首先获取到代表用户的Subject,将账号密码封装到UsernamePasswordToken得到token,然后调用login进入安全管理器;
  • 然后通过安全管理器调用Reaml;
  • 再然后自定义Reaml进行权限认证;
  • 最后可以通过logout退出认证;

使用

preview

    @PostMapping("/login")
    public String login(String adminName, String password){
        //获取当前用户
        Subject subject = SecurityUtils.getSubject();
        //封装用户登录信息
        UsernamePasswordToken token = new UsernamePasswordToken(adminName,password);
        try{
            //执行登录方法
            subject.login(token);
            //登录成功……,跳转helloworld页面
            return "helloworld";
        }catch (UnknownAccountException e){
            //用户名不存在
            model.addAttribute("msg","管理员名错误");
            return "index";
        }catch (IncorrectCredentialsException e){
            //密码不存在
            model.addAttribute("msg","密码错误");
            return "index";
        }
    }

快速开始

  1. 自定义Reaml

    //首先继承AuthorizingRealm 
    //重写俩个方法:授权和认证
    public class MyReaml entends AuthorizingRealm {
    	//授权
          @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
    	//……
        }
        //认证
         @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
    	//……
        }
    }
    
  2. 密码加密

    SimpleHash:Shiro自带的MD5加密算法

    BCryptspring的加密算法

    //BCrypt加解密
    public final class BcrypUtil {
        /**
         * 加密
         * @param password
         * @return
         */
        public static String encode(String password){
            return BCrypt.hashpw(password, BCrypt.gensalt());
        }
    
        /**
         * 密码校验
         * @param password
         * @param encodePassword
         * @return
         */
        public static boolean match(String password, String encodePassword){
            return BCrypt.checkpw(password, encodePassword);
        }
    }
    
  3. 注册到SpringBoot

    • 注册默认的AuthorizingRealm(认证领域)、SecurityManager(安全管理器)、SimpleCredentialsMatcher(密码管理器)ShiroFilterFactoryBean(校验规则)

//通过@Configuration类+@Bean注册bean
@Configuration
public class ShiroConfig {
	//重写校验规则的时候自带注册
    @Autowired
    private SecurityMatcher matcher;
    
    
    /**
     * 首先书Reaml
     * 身份认证 Realm
     * @return
     */
    @Bean
    public UserRealm userRealm(){
        UserRealm userRealm = new UserRealm();
        userRealm.setAuthenticationTokenClass(AuthenticationToken.class);
        userRealm.setCredentialsMatcher(校验器);
        return userRealm;
    }
    
    /**
     * 安全管理器
     * @param userRealm
     * @return
     */
    @Bean(name = "defaultWebSecurityManager")
    public DefaultWebSecurityManager getDefaultWebSecurityManager(){
        DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
        //关联UserRealm
        defaultWebSecurityManager.setRealm(userRealm());
        return defaultWebSecurityManager;
    }
    
    /**
     * 过滤器工厂(配置过滤规则)
     * @param defaultWebSecurityManager
     * @return
     */
    @Bean(name = "shiroFilterFactoryBean")
    public ShiroFilterFactoryBean getShiroFilterFactoryBean(){
      /**
       * anon:无需校验就可以访问
       * authc:登录才可以访问
       * user:“记住我才可以访问”
       * perms:拥有对于某一资源访问权限才可以访问
       * role:拥有某一角色权限才可以访问
       */
        ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
        //设置安全管理器
        bean.setSecurityManager(getDefaultWebSecurityManager());
        //添加shiro的内置过滤器,配置拦截规则
        Map<String,String> filterMap = new LinkedHashMap<>();
        filterMap.put("/swagger**/**","anon");//无需登录
        filterMap.put("/v3/**","anon");
        filterMap.put("/doc.html","anon");
        filterMap.put("/admin/login","anon");
        filterMap.put("/admin/addAdmin","roles[root]");//拥有root权限
        filterMap.put("/admin/**","authc");//需要登录
        //将自定义规则设置为过滤器的规则
        bean.setFilterChainDefinitionMap(filterMap);
        //配置无权限时跳转登录页面的位置(或者处理方式)
        bean.setLoginUrl("/toLogin");
        return bean;
    }

    /**
     * thymeleaf整合shiro
     */
    @Bean
    public ShiroDialect getShiroDialect(){
        return new ShiroDialect();
    }
}


@Compoment
public class SecurityMatcher extends SimpleCredentialsMatcher {
    @Override
    public boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {
        //前端传来的密码
        UsernamePasswordToken admin = (UsernamePasswordToken) token;
        String password = new String(admin.getPassword());
        //数据库中查询出的加密后的密码
        String encodePassword = (String) info.getCredentials();
        //密码比较
        return BcrypUtil.match(password, encodePassword);
    }
}

组件

Subject和SecurityUtils

  • Subject:**单个应用程序用户的状态和安全操作。这些操作包括身份验证(登录/注销)、授权(访问控制)和会话访问。**它是 Shiro 用于单用户安全功能的主要机制。
  • SecurityUtils:静态工具类,可以通过其getSubject获取当前访问(线程的Subject)

前面我们在使用的时候已经知道Subject仅仅通过一个login方法即可以实现登录验证;

Realm

SecurityManager

  • SecurityManager安全管理器,对全部的subject进行安全管理, 它是shiro的核心,负责对所有的subject进行安全管理。 SecurityManager调用调用shiro的各个最核心组件,连接当前请求和其他核心组件进行交互(授权、认证、session、crash等)
    • img
  • 实现体系*(其实现类似docker,层层嵌套,功能层层扩展)*
    • img

Authenticator和Authorizer

  • Authenticator即认证器,对用户身份进行认证,shiro提供ModularRealmAuthenticator实现类,通过 ModularRealmAuthenticator基本上可以满足大多数需求,也可以 自定义认证器。
  • Authorizer即授权器,用户通过认证器认证通过,在访问功能时 需要通过授权器判断用户是否有此功能的操作权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023最新面试题-Java-5

自定义类加载器 1. 为什么需要自定义类加载器 网上的大部分自定义类加载器文章&#xff0c;几乎都是贴一段实现代码&#xff0c;然后分析一两句自定义ClassLoader的 原理。但是我觉得首先得把为什么需要自定义加载器这个问题搞清楚&#xff0c;因为如果不明白它的作用的情况 …

人工智能动物农场的猪、牛和蟑螂

人工智能动物农场的猪、牛和蟑螂 农业正在成为由人工智能驱动的以数据为中心的业务。中国的大型科技公司正在使用神经网络支持的计算机视觉、可穿戴设备和预测分析算法来重新构想猪、鸡、牛、鹅和蟑螂养殖。 《南华早报》报道称&#xff0c;好医生制药集团每年在中国东南部的四…

OpenHarmony社区运营报告(2023年3月)

目录 本月快讯 一、代码贡献 二、生态进展 三、社区治理 五、社区活动 六、社区及官网运营 本月快讯 • 《OpenHarmony 2022年度运营报告》于3月正式发布&#xff0c;2022年OpenAtom OpenHarmony&#xff08;以下简称“OpenHarmony”&#xff09;开源项目潜心务实、深耕发展&am…

优化Key顺序提升ClickHouse查询性能

ClickHouse 键列顺序不仅影响表压缩效果&#xff0c;对查询性能也有很大影响&#xff0c;正确使用键列的顺序可以跳过大粒度数据范围&#xff0c;提高查询效率。本文通过示例进行测试不同场景的查询性能&#xff0c;从而让我们了解如何选择键列及其顺序。 测试数据 首先创建并…

从DY用户页面获取作品列表

最近DY的web端更新比较频繁&#xff0c;所以搞了很多方案来应对更新问题。 本文内容是其中一种方案&#xff0c;从用户主页的HTML响应内容中抽取user信息和作品列表数据。 下图中出现的内容都是在html名为RENDER_DATA的script标签中&#xff0c;以urlencode编码。 比如昵称、粉…

copilot技巧

copilot技巧 csdn排版不太好&#xff0c;推荐notion查看&#xff1a;https://superb-face-6ae.notion.site/copilot-25cf0f9882364056b5c76909b3a66ef9 一些基础原理&#xff1a; 我们想要使用copilot来干嘛呢&#xff1f;来生成代码。 怎样让它生成代码呢&#xff1f;给它一…

【PyTorch】第七节:数据加载器

作者&#x1f575;️‍♂️&#xff1a;让机器理解语言か 专栏&#x1f387;&#xff1a;PyTorch 描述&#x1f3a8;&#xff1a;PyTorch 是一个基于 Torch 的 Python 开源机器学习库。 寄语&#x1f493;&#xff1a;&#x1f43e;没有白走的路&#xff0c;每一步都算数&#…

GitHub收藏夹分类列表

前言 GitHub是一个基于Git的国际代码托管网站&#xff0c;其内容质量较高&#xff0c;用户在浏览时经常会收藏他人的项目&#xff0c;当收藏的项目越来越多后&#xff0c;用户再想查找之前特定的收藏项目会非常困难。 因此我们希望分类管理GitHub收藏夹&#xff0c;值得注意的…

Golang每日一练(leetDay0034) 二叉树专题(3)

目录 100. 相同的树 Same Tree &#x1f31f; 101. 对称二叉树 Symmetric Tree &#x1f31f; 102. 二叉树的层序遍历 Binary Tree Level-order Traversal &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一…

pdf怎么转换ppt格式,两个方法转换

PDF作为一种常用的文件格式&#xff0c;被大众所熟悉。虽然PDF具备的稳定性&#xff0c;安全性&#xff0c;以及很强的兼容性可以让我们更方便顺畅的阅读PDF文件&#xff0c;但若是有需要展示PDF文件内容的时候&#xff0c;其优点就没有那么凸显了&#xff0c;这时还是将pdf转换…

数据结构与算法基础(王卓)(25)线性表的查找(1):顺序查找(线性查找)

基本基础概念&#xff1a; 看这就不用去翻PPT了 查找&#xff1a; 根据给定的某个值&#xff0c;在查找表中确定一个与其关键字等于给定值的数据元素&#xff08;或记录&#xff09; 关键字&#xff1a; 用来表示一个数据元素&#xff08;或记录&#xff09;的某个数据项的值 主…

系统安全与应用【下】

文章目录1.开关机安全控制1.1 GRUB限制1.2 实例&#xff1a;GRUB 菜单设置密码2.终端登录安全控制2.1 限制root只在安全终端登录2.2 禁止普通用户登录3.弱口令检测3.1 Joth the Ripper,JR4.网络端口扫描4.1 nmap命令1.开关机安全控制 1.1 GRUB限制 限制更改GRUB引导参数 通常情…

读懂MAC地址

MAC地址是一种用于标识计算机网络设备的唯一地址。它是由48个二进制数字组成的&#xff0c;通常表示为12个十六进制数字&#xff0c;每两个数字之间用冒号或连字符分隔开。MAC地址由设备制造商在生产过程中分配&#xff0c;以确保网络上每个设备都有唯一的标识符。 MAC地址的规…

投影仪怎么连接电脑?快来看看这3种方法!

案例&#xff1a;如何连接电脑和投影仪&#xff1f; 【想看电影&#xff0c;但是电脑屏幕太小&#xff0c;我想把电脑上的内容通过投影仪投到大屏幕上。有小伙伴知道如何连接电脑和投影仪吗&#xff1f;谢谢大家&#xff01;】 使用投影仪可以将电脑或其他设备上的内容投放到…

Java——矩形覆盖

题目链接 牛客在线oj题——矩形覆盖 题目描述 我们可以用 21 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 21 的小矩形无重叠地覆盖一个 2*n 的大矩形&#xff0c;从同一个方向看总共有多少种不同的方法&#xff1f; 数据范围&#xff1a;0≤n≤38 进阶&#xff1…

九龙证券|啤酒龙头一季度净利暴增逾70倍!钛白粉开启年内第三次涨价

业内人士遍及认为&#xff0c;随着下流需求逐渐改进&#xff0c;钛白粉职业景气量有望恢复。 燕京啤酒昨日晚间发布一季度成绩预告&#xff0c;公司2023年一季度预计完成归母净利润6200万至6600万元&#xff0c;同比增加7076.76%至7539.77%。对于成绩变动的原因&#xff0c;燕京…

K8s为什么要放弃Docker

公司定期分享整理的资料 放弃始由 https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG-1.20.md#deprecation 2020 年&#xff0c;k8s 1.20 终于正式向 Docker “宣战”&#xff1a;kubelet将弃用 Docker 支持&#xff0c;并将在未来的版本中完全移除。…

Linux高性能服务器编程|阅读笔记:第1章 - TCP/IP协议族

简介 Hello! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出~ ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专业,获得过国家奖学金,有幸在竞赛中拿过一些国奖、省奖…已保研 学习经验:扎实基础 + 多做笔…

CLIMS:弱监督语义分割的跨语言图像匹配

文章目录CLIMS: Cross Language Image Matching for Weakly Supervised Semantic Segmentation摘要方法语言图像匹配框架实验结果CLIMS: Cross Language Image Matching for Weakly Supervised Semantic Segmentation 摘要 存在的问题 CAM(类激活图)通常只激活有区别的对象区…

第二章 数据类型与变量

文章目录1. 字面常量2. 数据类型3. 变量3.1 变量概念3.2 语法格式3.3 整形变量3.3.1 int整型变量(4 个字节)3.3.2 long长整型变量&#xff08;8 个字节&#xff09;3.3.3 short短整型变量(2 个字节)3.3.4 byte字节型变量&#xff08;1个字节&#xff09;3.4 浮点型变量3.4.1 do…