1、Shiro可以完成: 【认证、授权、加密、会话管理】、与Web集成、缓存等
2、特点: 易于使用、全面、灵活、强力支持Web、兼容性强、社区支持
![](https://i-blog.csdnimg.cn/blog_migrate/ac6a773633c61d7ce730db01c8d575b9.png)
外部观看
![](https://i-blog.csdnimg.cn/blog_migrate/70ddbede90e2d1be1376e3c6f0af9239.png)
内部观看
3、 登录认证:
1)身份验证:一般需要提供如身份ID等一些标识信息来表明登录者的身份,如提供email,用户名/密码来证明
2)在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro,从而应用能验证用户身份
3)principals:身份,即主体的标识属性,可以是任何属性。如用户名、邮箱等,唯一即可。一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/邮箱/手机号
4)credentials:证明/凭证,即只有主体知道的安全值,如密码/数字证书等
5)最常见的principals和credentials组合就是用户名/密码
![](https://i-blog.csdnimg.cn/blog_migrate/e0b31d55e0a6a938fac266c78a93bbd6.png)
一个简单的登录demo测试代码
![](https://i-blog.csdnimg.cn/blog_migrate/625f9bcdda758f6978c2e4b7c27e6871.png)
角色与授权
1、授权:访问控制,即在应用中控制谁访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象: 主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)
2、主体: 访问应用的用户,在Shiro中使用Subject代表该用户。用户只有授权后才允许访问相应的资源
3、资源: 在应用中用户可以访问的URL,比如访问JSP页面,查看/编辑某些数据、访问某个业务方法、打印文本等等都是资源。用户只要授权后才能访问
4、权限: 安全策略中的院子授权单位,通过权限我们可以表示在应用中用户,有没有操作某个资源的权力。即权限表示在应用中用户能不能访问某个资源,如:访问用户列表页面查看/新增/修改/删除用户数据等。权限代表了用户有没有操作某个资源的权利,即反映在某个资源上的操作允不允许
5、Shiro支持粗粒度权限和细粒度权限
6、角色: 权限的集合。 一般情况下会赋予用户角色而不是权限,即这样用户可以拥有一组权限,赋予权限时比较方便
授权流程:
![](https://i-blog.csdnimg.cn/blog_migrate/c01a5e964b81d525f32e315e33436f30.png)
判断角色与权限的Demo代码
![](https://i-blog.csdnimg.cn/blog_migrate/4026027c29ab153556052881cd631f7c.png)
Shiro加密
1、带盐的md5加密,盐就是在密码明文后拼接新字符串,然后再进行加密
2、多次进行md5的迭代加密
3、使用父类进行加密
//shiro自带了多种加密的方法
![](https://i-blog.csdnimg.cn/blog_migrate/aa33a1b76b9afb1e188570cfc3fcc410.png)
Shiro自定义登录认证 【需要继承 AuthenticatingRealm 实现 doGetAuthenticationInfo 方法】
//自定义登录认证方法,shiro的login方法底层会调用该类的认证方法进行认证
//需要配置自定义的realm生效,在ini文件中配置,在springboot中配置
步骤:
获取身份信息、获取凭证信息、获取数据库中存储的用户信息、创建封装校验逻辑对象,封装数据返回
![](https://i-blog.csdnimg.cn/blog_migrate/888f2031cecd6b4cc7dac43b852e8708.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d6ee88346acb83684388956f83153197.png)
一、rememberMe功能:
![](https://i-blog.csdnimg.cn/blog_migrate/0e20d95ce57f1a6834b0d49f93e7a107.png)
![](https://i-blog.csdnimg.cn/blog_migrate/a5455f1fa4edf9986e1d89d0314617fb.png)
![](https://i-blog.csdnimg.cn/blog_migrate/691e8c57426a324530b1d2480a891463.png)
二、对用户进行角色和权限的设置
在自定义实现的Realm中,继承AuthorizingRealm 需要实现两个方法,其中doGetAuthorizationInfo是自定义授权的方法 以下代码仅进行示例 实际可能通过某种方式获取用户的实际角色和权限, 然后赋值 。 然后可以使用shiro的注解功能进行某些角色或权限的控制 。 **实际工作中可能需要更完善的权限验证规则
![](https://i-blog.csdnimg.cn/blog_migrate/1b64f36bc99d9bf4cef5900f02510aae.png)
三、对全局进行的异常处理
![](https://i-blog.csdnimg.cn/blog_migrate/0a076782e95caa9218f1ff035063c193.png)
@ControllerAdvice是在类上声明的注解。
@ExceptionHandler注解标注的方法:用于捕获Controller中抛出的不同类型的异常,从而达到异常全局处理的目的。