前言

目前主流的开源安全框架有Spring Secutiry 和Shiro,Shiro的轻量化和较低学习成本使得其在项目开发中应用广泛。不过平心而论,做开发也有三年我对这块接触地确实不多。通常情况下Shiro模块都是公司项目早期设计完成不会有大的调整,所以后续进入公司的开发人员接触到的这块也不是很多,较多的都是业务模块上的开发设计。最近手头上项目需要重新设计Shiro登陆模块,刚好通过此次机会对Shiro加深下学习,弥补知识盲点并做记录总结,工作中学到的知识印象更深刻。

学习目标
  1. 熟悉Shiro框架主要构成部分

  2. 熟悉Realm主要作用

Shiro相关

Apache Shiro是一个强大且易用的 Java 安全框架,执行身份验证、授权、密码学和会话管理。

这里需要清楚两个极易混淆的单词:Authentication | Authorization

Authentication [ɔ:ˌθentɪ’keɪʃn] 认证

认证,就是登录时候判断principals和credentials是否完全匹配,通常就是校验用户名和密码是否匹配,以此证明账号合法性,证明你就是你。

Authorization [ˌɔ:θəraɪˈzeɪʃn] 授权

授权,是在认证的基础之上,进行角色和权限的授予。权限决定了用户可以对资源进行怎样的操作。常见的如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户对某个资源是否具有某个操作权限。

从应用程序角度观察Shiro工作流程:
image

Application Code表示某个具体应用程序,其与Shiro直接交互的对象为Subject,则说明Shiro对象API核心即为Subject。与当前应用交互的任何主题都是Subject,表示当前用户,应用与Subject的所有交互都会委托给SecurityManager进行管理。SecurityManager要验证用户身份,需要从Realm获取相应的用户进行比较以确定用户身份是否合法;也需要从Realm得到用户相应的角色/权限进行验证用户是否能进行操作;可以把Realm看成DataSource,即安全数据源。

其他重要对象

SessionManager

负责创建会话、管理回话的生命周期以便在所有运行环境下都可以给用户提供一个健壮的回话管理体验

SessionDAO

执行Session相关的增删改查。这个接口允许我们将任意种类的数据存储方式引入到Session管理的基础框架中。

CacheManager

缓存是将后端获取到的用户验证Authentication与权限控制Authorization方面的数据存储到缓存中以提高性能,在获取数据时,总是先从缓存中查找,如果没有再调用后端接口从数据源获取,用以提供更高的性能和更好的用户体验。

Realm作用

在认证、授权内部实现机制中最终处理交给Realm进行处理,通过Realm调用doGetAuthenticationInfo()获取用户信息,通过doGetAuthorizationInfo获取角色权限信息。

从Shiro工作流程图中也可以观察到Realm承担了从数据源中身份认证和权限验证功能,一般情况需要开发人员自己实现Realm来自定义管理系统内部的认证和权限规则。

Java中由Controller层到Realm登陆认证doGetAuthenticationInfo执行流程大致如下:

  • 使用用户登陆信息创建令牌
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
  • 执行登陆动作
Subject subject = SecurityUtils.getSubject(); // 获取Subject单例对象
subject.login(token); // 登陆
  • 根据提交的认证令牌信息获取用户信息
String username = (String)token.getPrincipal();
User user = userService.selectByUsername(username);
  • 组装认证实例对象
SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(
                user, //用户
                user.getPassword(), //密码
                ByteSource.Util.bytes(username),//salt
                getName()  //realm name
        );
  • 验证通过后返回AuthenticationInfo实例,该实例对用户信息,密码,salt盐进行封装。

Shiro是一个功能很齐全的框架,使用起来也很容易,但是要想用好却有相当难度。这里先简单介绍以做知识储备,后续将从需求角度出发实际编写代码练习Shiro。

Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐