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版权协议,转载请附上原文出处链接和本声明。