Shiro(2)

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
    评论
基于引用内容和,可以解释shiro oauth2的工作原理。shiro oauth2是一种基于OAuth2协议的认证和授权框架。在shiro oauth2中,客户端应用首先向认证服务器申请令牌,包括第三方用户信息和用户请求信息。认证服务器会根据客户端应用的信息以及存储的第三方应用信息,生成Oauth2Authentication并创建Oatuth2AccessToken令牌。然后,TokenStore将令牌存储到指定的存储器中。 在资源服务器端,客户端携带令牌发送请求到达Oauth2AuthenticationProcessFilter。这个过程中,tokenExtractor会从请求中获取Authentication信息。OAuth2AuthenticationManager会通过tokenService查询token对应的OAuth2Authentication。如果登陆成功,Authentication会被放到SpringSecurityConetxt中。 基于引用内容,shiro oauth2还需要在配置文件中配置客户端的信息。这些信息包括clientId、clientSecret、accessTokenUri、userAuthorizationUri和userInfoUri等。 总结起来,shiro oauth2是通过OAuth2协议实现的一种认证和授权框架,它包括申请令牌的流程和验证令牌的流程。在使用shiro oauth2时,需要配置客户端的信息,并且可以使用TokenStore将令牌存储到指定的存储器中。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [SpringSecurity、Shiro、Oauth2.0、Cas](https://blog.csdn.net/m0_37695902/article/details/117596437)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [【开发技术】2万字分析shiro、spring security两大安全框架,spring session,OAuth2 入门级教程](https://blog.csdn.net/a23452/article/details/125967279)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值