Shiro(2)

Apache Shiro是一个轻量级的Java安全框架,提供身份认证、授权、加密和会话管理功能。它易于使用,可与Spring集成,适用于多种环境。Shiro的核心组件包括Subject、SecurityManager和Realm。相比Spring Security,Shiro更简单,适合不需要过于复杂安全需求的项目。Shiro通过Realm连接应用数据源,实现登录认证和权限授权。JWT在Shiro中可用于异步通讯的登录验证,提供安全的身份验证。
摘要由CSDN通过智能技术生成

Shiro

shiro是apache旗下一个Java安全框架,它将软件系统的安全认证相关的功能抽取出来,实现用户身份认证、权限授权、加密、会话管理等功能,组成了一个通用的安全认证框架。使用shiro就可以非常快速的完成认证、授权、加密,会话管理等功能的开发,可为任何应用提供安全保障,降低系统成本

Shiro功能

  • 登录/身份认证,登录失败次数限制
  • 对用户执行访问控制,如: 判断用户是否拥有角色admin,判断用户是否拥有访问的权限
  • 在任何环境下使用Session API。例如CS程序
  • 加密,保证数据安全;
  • 可以使用多个用户数据源。例如一个是oracle用户库,另外一个是mysql用户库
  • Caching:缓存(支持分布式cache管理);
  • 单点登录SSO功能
  • "Remember Me"服务,类似购物车的功能,shiro官方建议开启
  • Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
  • Shiro可以很友好的与Spring集成,支持jsp标签

Shiro三大核心组件

Shiro有三大核心的组件:Subject、SecurityManager 和 Realm

ApplicationCode为客户端,在Web环境中为登录的Controller,使用者只需要创建一个Subject对象,调用其上的login()方法,即可完成登录。在使用者角度只需要在SpringIOC容器中配置ShiroSecurityManager注入Realm即可简单使用

Subject认证主体,是需要认证的东西,最常见的就是用户名密码。它包含两个信息Principals和Credentials

  • Principals身份。可以是用户名,邮件,手机号码等,用来标识一个登录主体身份
  • Credentials凭证。常见有密码,数字证书等等。

SecurityManager安全管理员。这是Shiro架构的核心,它就像Shiro内部所有原件的保护伞一样。在项目中一般都会配置SecurityManager,开发人员大部分精力主要是在Subject认证主体上面。在与Subject进行交互的时候,实际上是SecurityManager在背后做一些安全操作

Realm是一个域,它是连接Shiro和具体应用的桥梁,当需要与安全数据交互的时候,比如用户账户、访问控制等,Shiro就会从一个或多个Realm中去查找。可以把Realm看成DataSource,即安全数据源,一般会自己定制Realm,在自定义Realm中一般会从数据库中获取和认证相关的信息

Spring Security和Shiro

在 Spring Boot 中做权限管理,一般来说,主流的方案是 Spring Security ,但是由于 Spring Security 过于庞大和复杂,只要能满足业务需要,大多数公司还是会选择 Apache Shiro 来使用。

  1. 适用范围: Spring Security 必须和 Spring MVC 一起使用, 而 Shiro 是一个通用的安全框架, 可以用在 Spring MVC 或 JavaEE/JavaSE 环境中
  2. 复杂程度: Spring Security 是一个非常复杂的架构, 虽然搭配 Spring Boot 后, 使用的难度小了些, 但是还是很复杂. Shiro 概念少, 使用也简单了很多
  3. 版本变动: Spring Security 变化很频繁, 网上教程多是基于 Spring Boot 1.x 的, 在 Spring Boot 2.x 下很多都不适用了. Shiro 从 2010 年发展到现在, 功能和代码已经相当成熟了, 几乎不会有大的变动
  4. 功能多少方面, 方面: Spring Security 内置支持 CSRF 保护, Shiro 没有开箱即用, 基于 Shiro 的项目 buji-pac4j 实现了 CSRF 保护.

Shiro过程

  1. 创建 SecurityManager 对象。对于 Web 项目可以直接new DefaultWebSecurityManager子类, ini 文件的realm也可以使用 IniSecurityManagerFactory 工厂方法创建
  2. 在程序中注入SecurityManager对象。对于Spring项目需要定义一个ShiroFilterFactoryBean,然后通过该bean来注册SecurityManager,shiroFilterFactoryBean.setSecurityManager(securityManager)。对于其他项目, 可以使用 SecurityUtils.setSecurityManager(securityManager) 注入
  3. 进行资源授权配置。对于 Spring 项目, 可以用 ShiroFilterFactoryBean bean来设置拦截器;也可以在 ini 文件的 url 节中定义资源授权配置
  4. 定义 Realm, 实现 doGetAuthenticationInfo(AuthenticationToken) 和 doGetAuthorizationInfo() 方法. doGetAuthenticationInfo( authcToken)。对于 JDBC , 一般是 user/role/permission 三张表, 以及 user_role/role_permssion 两个关系表,也可以在 Ini 文件中定义, 基本用作demo
  5. 使用 SecurityUtils.getSubject() 获取 subject, 然后调用 subject.login(), 该方法将触发 realm 的 doGetAuthenticationInfo(AuthenticationToken authcToken) 方法, 进行身份验证
  6. 在进行权限验证的时候, 会触发 realm 的 doGetAuthorizationInfo(PrincipalCollection principals) 函数, 由该函数进行角色和权限的验证

权限管理模型

RBAC模型

  • 主体(账号、密码)

  • 资源(资源名称、访问地址)

  • 权限(权限名称、资源id)

  • 角色(角色名称)

  • 角色和权限关系(角色id、权限id)

  • 主体和角色关系(主体id、角色id)

通常企业开发中将资源和权限表合并为一张权限表,包括资源(资源名称、访问地址)和权限(权限名称、资源id)。合并为:权限(权限名称、资源名称、资源访问地址)

基于角色的访问控制是不利于系统维护,可扩展性不强。
角色针对人划分的,人作为用户在系统中属于活动内容,如果该角色可以访问的资源出现变更,需要修改代码了

资源在系统中是不变的,比如资源有:类中的方法,页面中的按钮。一般建议使用基于资源的访问控制实现权限管理

口令的加密

口令是用于验证,证明你是你说的人

  • 口令采用md5加密,为了避免使用碰撞算法进行解密,所以引入盐值和多次进行hash计算
盐值的生成

uuid生成32位长的随机串

String ss = UUID.randomUUID().toString();
ss = ss.replaceAll("-", "");
System.out.println(ss+"----"+ss.length());

使用shiro提供的随机算法生成32位长的字符串

String salt2 = new SecureRandomNumberGenerator().nextBytes().toHex();
System.out.println(salt2+"-----"+salt2.length());
口令加密

只使用md5加密

String pwd="123456";
String salt="有可能会使用用户名充当盐值";
int num=3;//进行hash计算的次数,次数值越大安全性越高,但是cpu算力的浪费越明显
//构造方法中:参数1明文,原始密码; 参数2盐,通过使用随机数; 参数3散列的次数,比如散列两次,相当于md5(md5(''))
Md5Hash md5=new Md5Hash(pwd,salt,num);
String res=md5.toHex()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值