狂神Shiro 笔记

Shiro

简介

  • 三个核心:Subject,Shiro SecurityManager,Reaim
    • Shiro SecurityManager管理Subjec
  • 架构
  • Authentication 身份认证、登录
  • Authorization 授权,即权限验证,验证某个已经认证的用户是否拥有某个权限
  • Session Manager 会话管理,session管理 web里边
  • Cryptography 加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储
  • Web Support 能够容易的集成Web
  • Run As伪装
  • Remember Me:记住我,再一次登录之后,下次访问不需要登录了
  • web 401错误 未授权的错误
  • 命名空间
  • xmlns:th=http://www.thymeleaf.org 
    				xmlns:sec=http://www.thymeleaf.org/extras/spring-security
    				xmlns:shiro=http://www.pollix.at/thymeleaf/shiro
    

内置的过滤器

  • anon 无需认证就可以访问
  • authc 必须认证
  • user 记住我才能使后用
  • perms拥有对某个资源的权限才能进行访问
  • roler 拥有某个角色的权限才能访问

实现用户认证

  • 是有ShiroConfig类和UserRealm类进行联动完成拦截的任务
  • try catch 分支结构实现这个登录页面的跳转
  • P43 //密码验证 //加密 md5 HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); //加密算法的名称 hashedCredentialsMatcher.setHashAlgorithmName(MD5); //是否让它 进行16进制的编码 hashedCredentialsMatcher.isStoredCredentialsHexEncoded(); // 迭代的次数 //hashedCredentialsMatcher.setHashIterations(3); SimpleHash simpleHash = new SimpleHash(MD5,user.getPwd() ); String s = simpleHash.toHex(); return new SimpleAuthenticationInfo(,s,);
  • 整合代码
  • yml 格式
  • spring:
    
      datasource:
    
        usernam e: root
    
        password: 123456
    
        #?serverTimezone=UTC解决时区的报错
    
        url: jdbc:mysql://localhost:3306/ssmbuild?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
    
        driver-class-name: com.mysql.cj.jdbc.Driver
    
        type: com.alibaba.druid.pool.DruidDataSource
    
    
    
        #Spring Boot 默认是不注入这些属性值的,需要自己绑定
    
        #druid 数据源专有配置
    
        initialSize: 5
    
        minIdle: 5
    
        maxActive: 20
    
        maxWait: 60000
    
        timeBetweenEvictionRunsMillis: 60000
    
        minEvictableIdleTimeMillis: 300000
    
        validationQuery: SELECT 1 FROM DUAL
    
        testWhileIdle: true
    
        testOnBorrow: false
    
        testOnReturn: false
    
        poolPreparedStatements: true
    
    
    
          #配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
    
          #如果允许时报错  java.lang.ClassNotFoundException: org.apache.log4j.Priority
    
          #则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
    
        filters: stat,wall,log4j
    
        maxPoolPreparedStatementPerConnectionSize: 20
    
        useGlobalDataSourceStat: true
    
        connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
    

Subject

  • session中取值存值
  • isAuthenticated 当前用户是否被认证
  • token 令牌

问题解决

  • 在shiroo那块,首次访问报400,url中有Jsessionid生成的原因: jsessionid是标明session的id,它存在于cookie中,一般情况不会出现在url中,服务器会从客户端的cookie中取出来,但是如果客户端禁用了cookie的话,就要重写url了,显式的将jsessionid重写到Url中,方便服务器来通过这个找到session的id。 如果客户端请求的cookie中不包含JSESSIONID,服务端调用request.getSession()时就会生成并传递给客户端,此次响应头会包含设置cookie的信息 如果客户端请求的cookie中包含JSESSIONID,服务端调用request.getSession()时就会根据JSESSIONID进行查找对象,如果能查到就返回,否则就跟没传递JSESSIONID一样; 解决方式,在properties中添加: server.servlet.session.tracking-modes=cookie server.servlet.session.cookie.http-only=true

日志相关

  • 首先是依赖包
  • <!--        日志门面有两个在这边引入一下-->
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>jcl-over-slf4j</artifactId>
            </dependency>
            <dependency>
                <groupId>org.slf4j</groupId>
                <artifactId>slf4j-log4j12</artifactId>
            </dependency>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
    
  • 前两个依赖包是日志门面,能够帮助我们调用很多的日志文件
  • log4j自己可以保留也可以直接删除 估计是有跟高效的框架

补充知识

  • 学习新框架时要注意Hello world 和quick start两个方面,注意要快速写完并且理解这些东西
  • 读代码是一个很好的习惯,之后再刷网课的时候要多注意学习源码的阅读方法
  • 官方给的流程图可以在示例代码中找到原型

版权声明:本文为fengjiuxin原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。