什么是权限管理:
基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范畴,权限管理实现 对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源。
权限管理包括用户身份认证和授权两部分。
shiro是apache旗下一个开源框架,他将软件系统的安全认证相关的功能抽取出来,实现用户身份认证,权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。
shiro中的认证:
shiro认证中的关键对象:
Subject: (主体)
访问系统的用户,主体可以是用户,程序等,进行认证的都称为主体。
Principal:(身份信息)
是主体进行身份认证的标识,标识必须具有唯一性,如用户名,手机号等,一个主体可以有多个身份,但必须有一个主身份。
credential:(凭证信息)
是只有主体自己知道的安全信息,如密码等。
Shiro的配置文件是 .ini结尾的。
进行身份认证:
UnknownAccountException异常 ----> 用户名不存在
IncorrectCredentialsException异常 ----> 密码错误
自定义realm,让身份信息和数据库中的信息进行比较:
创建一个类继承AuthorizingRealm类
MD5加密算法:
一般用来加密或者签名。
MD5算法是不可逆的,始终是一个16进制32位长度字符串。
Shiro实现MD5:
实现Salt:
只需要在认证的时候多加一个参数。
散列(hash):
shiro中的授权:
授权可简单理解为who对what进行how操作。
Who,即主体(Subject),主体需要访问系统中的资源。
What,即资源(Resource),如系统菜单、页面按钮等。
How,授权/许可(Permission),规定了主体对资源的操作许可。
授权方式:
基于角色的访问控制
RBAC基于角色的访问控制是以角色为中心进行访问控制。
基于资源的访问控制
RBAC基于资源的访问控制是以资源为中心进行访问控制。
授权的实现:
springboot整合shiro:
需要三个conifg
shiroFilter:拦截所有请求,判断这个请求的资源是受限资源还是公开资源。
访问到受限资源,并且没有认证和授权是会默认回到login页面。
身份认证需要自定义reaml
具体实现:
自定义Realm:
角色授权方式:
使用MD5+salt加密密码:
使用了MD5+salt加密密码过后验证用户需要配置:
使用Redis作为shiro的缓存:
1.导入Redis依赖
2. 启动Redis,并且在springboot中配置连接redis的相关服务
3.自定义shiro缓存管理器
4.自定义Redis缓存的实现
5.获取到springboot容器中的Redis组件,将一些结果放在Redis组件中。
6.自定义数据库实体类要进行序列化。实现Serializable接口
7.salt也要进行处理,处理完过后要在,进行验证salt中把序列化过后的salt放入其中。
Springboot整合redis:
1.导入依赖
2.配置一个ShiroConfig类
配置三个组件:
ShiroFilterFactoryBean
DefaultWebSecurityManager
Realm
SimpleAuthenticationInfo(); 比较密码
退出功能:
subject.logout();
MD5 + salt:
ByteSource.util.bytes();
还要在Reaml中声明为MD5和散列数
加载springboot上下文中的组件:
授权:
要在前端页面导入配置:
使用注解判断角色是不是正确的
@RequiresPermissions("")
基于角色进行授权
权限:
shiro整合redis
1.导入依赖
2.写一个类实现CacheManager
3.自定义一个类实现cache类,重写redis的增删改查等。
自定义实体类和salt要序列化。
自定义salt可以直接实现ByteSource,把原来ByteSource中的代码复制过来就行了,还要添加个无参构造器。