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

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/hyly_zhard/article/details/100047382

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进制。
这里的进制数一定要统一。

猜你喜欢

转载自blog.csdn.net/hyly_zhard/article/details/100047382