什么是Shiro?
- Apache Shiro 是一个Java 的安全(权限)框架
- Shiro可以非常容易的开发出足够高好的应用,其不仅可以在JavaSE环境,也可以在JavaEE环境
- Shiro可以完成,认证、授权、加密、会话管理、Web继承、缓存等
- 下载地址:Shiro
- 一个简单的 Java 安全框架
有哪些功能?
- Authentication:身份认证、登录、验证用户是不是拥有相应的身份
- Authorization:授权,即权限验证,验证某个已认证的用户是否有某个权限,即判断用户能否进行什么操作,如:验证耨个用户是否拥有某个角色,或者细粒度的验证某一个用户对某个资源是否具有权限
- SessionManager:会话管理,即用户登录后就是第一次会话,在没有退出之前,丫的所有信息都在会话中;会话可以是普通的JvaSE环境,也可以是Web环境;
- Crytography:加密,保护数据的安全性,如密码加密到存储到数据库中,而不是明文存储;
- Web Support:Web支持,可以非常容易的集成Web环境;
- Cathing:缓存,比如用户登录后,其用户信息,拥有角色、权限不必每次去查,这样可以提高效率
- Concurrency:Shiro支持多线程应用的并发验证,即,在一个线程中开启另一个线程,能把权限自动的转播过去
- Testing:提供测试支持
- Run As: 允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
- Remember Me:记住我,这个是非常常见的功能,即登陆一次后,下次再来的话就不用登陆了。
Shiro架构(外部)
从外部来看Shiro,即从应用程序角度来管擦如何使用Shiro完成工作:
- subject:应用代码直接交互的对象是Subject,也就是说Shiro的对外API核心就是Subject,Subject代表了当前用户,这个用户补一个ID哪个是一个具体的人,与当前应用交互的任何东西都是Subject,如网络爬虫,机器人等,与Subkect的所有交互都会委托给SecurityManager;Subject其实是一个门面,SecurityMannager才是实际的执行者。
- SecurityManager:安全管理器,及所有安全有关的操作都会与SecurityMangager交互,并且他管理这所有的Subject,可以看出他是Shiro的核心,他负责Shiro点其他组件进行交互,它相当于SpringMVC的DispacherServlet的角色。
- Realm:Shiro从Realm获取安全数据(如用户,角色,权限),就是说SecurityManager眼验证用户身份,那么他需要从Realm获取响应的用户进行比较,来确定用户的身份是否合法;也需要从Realm得到用户相应的角色、权限,进行验证用户的操作是否能够进行,可以吧Realm看成DataSource。
依赖导入(版本)
log4j.properties
Shiro.ini文件
需要ini插件 显示高亮
QuickStart
SpringBoot整合Shiro环境搭建
自定义UserRealm
创建ShiroConfig
@Qualifter(“UserRealm”)绑定创建的realm对象 指定这个域名
@Bean 交给Spring接管这个Bean,要通过Spirng把这个接管的Bean拿到就需要在这个方法里面传入这个UserRealm这个UserRealm的参数 或者在@Bean注解上@Bean( name=“userRealm”) 给一个名字 @Qualifter听过这个名字也可以绑定过来
上面三个方法都要加@Bean 交给Spirng管理 这个类还要加一个@Configuration 在public class Shiro上加这个注解
Controller页面请求
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ydSkuush-1624081934700)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135145.png)]
前端编写
update.html
add.html
Shiro实现登陆拦截
ShiroConfig设置过滤器
添加shiro的内置过滤器
- anon:无需认证就可以访问
- authc:必须认证了才能访问
- user:必须拥有记住我功能才能用
- perms:拥有某个资源的权限才能访问
- role:拥有某个角色才能访问
由于链式编程,new了一个LinkeHashMap<>()
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dfO3nsyb-1624081934702)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135149.png)]
添加一个登录页面
Controller 设置一个跳转到登录页面
通配符写法
filterMap.put(“user/*”,“authc”)
Shiro实现用户认证
Controller在写一个方法验证用户的
前端页面接受显示消息
UserRealm进行配置认证
Shiro整合MyBatis
导入依赖
application.yml
用来设置一些数据源的初始化
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mcKJJMaN-1624081934705)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135156.png)]
application.properties
mybatis的配置
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l6KjXhr8-1624081934705)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135157.png)]
编写mapper.xml文件和pojo文件,还有ServiceImpl和Service java文件
UserRealm 用户认证
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8YI3sMWl-1624081934706)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135158.png)]
Shiro请求授权实现
Controller添加未授权页面
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5L36GdpR-1624081934707)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135159.png)]
在ShiroConfig里设置未授权页面
所有的权限必须要有perms[user:add] 这个才能授权
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-c265LafC-1624081934707)(https://gitee.com/mjj2496776788/markdown.image/raw/master/20210619135200.png)]
把权限给用户
//自定义的UserReaml 继承 extends AuthorizingRealm
public class UserReaml extends AuthorizingReaml{
@Autowired
UserService userService;
//授权
@Override
protected AutorizationInfo doGetAuthorizationInfo(PrincipaCollection principals){
SimpleAuthentication info = new SimpleAuthorizationInfo();
info.addStringPermission("user:add");
//拿到当前登录的这个对象
Subject subject = SecurityUtils.getSubject();
User currentUser = (User) subject.getPrincipal() //拿到User对象
//设置当前用户权限
info.addStringPermissions(crurentUser.getPrem())
return info; //接受这个对象,才能授权
}
//认证
@Override
protected AuthenticationInfo doGetAutothenticationInfo(AuthenticationToken token) thows AuthenticationException{
System.out.println("执行了=> 认证doGetAuthorizationInfo");
UsernamePasswordToken userToken = (UsernamePasswordToken) token ;
//连接真实数据库
User user = userService.queryUserByName(userToken.getUsername());
if(user == null){ //没有这个人
return null;
}
//可以加密 :MD5: DFSDFDSFG MD5 盐值加密 在原来加密的基础上添加一些字符串加密
//密码认证 shiro做 加密了
return new SimpleAuthenticationInfo(user,user.getId(), "");
}
}
//授权的页面在添加
filterMap.put("user/update","prems[user:update]");
密的基础上添加一些字符串加密
//密码认证 shiro做 加密了
return new SimpleAuthenticationInfo(user,user.getId(), “”);
}
}
```java
//授权的页面在添加
filterMap.put("user/update","prems[user:update]");
总结一下项目,本次课题分为三层开发,第一层就是我们的控制层(Controller),业务层(Service)以及我们的DAO层,就是Mapper层,我们说他是数据库的接口层,专门负责调用数据库的数据提供给用户使用的,通过Mapper层,配置Mapper.xml文件来和项目中实体类和数据库的字段来一一映射,SQL语句的执行,再往下就拿到MyBatis的一个数据连接池,语句的执行就是相当于你那数据库的数据,那么整合了MyBatis框架的Spring Boot,高效运转,每当我们请求数据,MaBatis就会通过一条信息的传输密文,每一次的请求数据库,Mybatis就拿到一条数据链返回给请求数据,然后请求完成这一条数据有把这一条密文交还回给MyBatis驱动层,等下次使用的时候再拿出来交给用户,如此反复高效的执行着;拿到数据便是返回到业务层,就是service层,service层再把数据交给Controller,通过接口请求返回给客户,这就是在本次项目中对Spring Boot整合MyBatis的理解和整理。