shiro权限认证赋权,加密解密流程以及注意点

本文深入探讨了Shiro权限框架的三大核心组件:Subject、SecurityManager和Realm的工作原理。详细解释了Subject作为交互入口,SecurityManager负责认证流程,以及Realm存储用户核心信息的作用。此外,还介绍了Shiro如何实现加密匹配,以及在权限控制、用户登录状态管理和单点登录方面的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

shiro有三大部分组成:subject,securityManager,Realm
subject:负责于项目进行交互,暴露给外界使用,subject保存着用户的基础信息。
securityManager:subject会将认证委托给securityManager进行认证。
Realm:保存着用户的核心信息,保存着数据源。例如:权限密码。

运行原理:
    得到subject之后,它是用来操作鉴权的起点,当前端的用户输入账号和密码,后台接收到之后,封装成一个UsernamePassword对象,注意这个对象保存的是前端输入的明文密码,当subject调用login方法之后,subject将认证的流程委托给
    securityManager,securityManager会调用认证器,去进行认证判断,认证判断的数据是从Realm中获取过来的,Realm的数据可以从int配置文件获取,也可以从数据库获取。这里假设是从数据库获取的。
    通过用户名从数据库中获取密码和盐值,查询之后将从数据库查询出来的用户名、密码、盐值、ream名传递构建出来SimpleAuthenticationInfo对象返回。
注意这个地方的盐值,如果在数据不是字符串的话需要进行转换。
也许有人会很奇怪,前端的明文密码是如何和数据中的密码做检验的呢?因为在你构建UsernameAndPassword的时候,就将用户名和密码交给shiro管理了。然后再自定i的realm中又传递进去了盐值和加密后的密码。
这些数据最终会到达
在这里插入图片描述
这个地方会将盐值取出然后将明文密码加密,然后和数据库的密码做比较。

使用shiro做权限控制,如果Realm是从数据库获取数据的话,数据库至少要有三张表:用户表、角色表、角色权限表。

shiro可以可以做一个用户是否已经登录。
可以做权限的认证,拦截。
可以做一个用户只能在一个程序上登录一次。

注意:realm只做数据的维护,提供数据;提供给SecurityManager使用。

加密:
现在数据库中一般存储的都是密文密码。
那shiro是如何实现加密后的匹配的呢?

流程:
1、Realm设置认证匹配器,认证匹配器设置加密的规则。
2、将Realm设置给SecurityManager。
3、当前端输入账号密码之后,后端将输入的明文账号和密码使用UsernamePasswordToken进行包装。在和数据库中的密码进行匹配的时候,这个明文的密码由于Realm设置了认证匹配器,所以在进行认证的时候,会将前端的明文密码也进行加密,然后在匹配。(注意:我该开始的时候以为是将数据库取出的密码转成明文,但是现在的加密都是不可逆的,并且如果将数据库中的密码解密出来在和明文密码做检验的话,也就是失去了加密的意义了)
4、这个地方在Realm中,会使用前端输入的用户名,不用密码,先去查询用户,然后将查询的用户的密码传入simpleAuthen



比较需要注意这个地方:
在这里插入图片描述
shiro默认采用的密码是十六进制的,如果你传递过来的不是十六进制的话,需要再认证匹配其哪个地方指定
//设置系统凭证的编码转换格式,也就是密码转成什么格式去比对,默认为true,表示16进制,
hashedCredentialsMatcher.setStoredCredentialsHexEncoded(false);
表示不使用16进制。
这里的进制数一定要统一。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值