简介

Shiro相对于Spring security来说是一个较为轻量级的java安全框架,我们在日常的代码开发中shiro的功能就已经足够我们使用了。
Shiro可以帮助我们在开发应用中完成认证,授权,加密,会话管理与Web集成和缓存的功能。
Shiro的功能API也是极其简单的,基本功能点如图所示

image.png

  • Authentication:身份认证/登录,验证用户是否拥有对应的身份
  • Authorization:授权,权限验证,验证某个已经认证的用户是否拥有某个权限
  • Session Manager:会话管理,用户登录后就是一次会话,所有信息都保存在会话中
  • Cryptography:加密,保护数据的安全性,如密码的加密存储
  • Web Support:Web支持,可以集成到Web应用中
  • Caching:缓存,用户登录之后,其用户信息和权限,角色等信息不用每次都去查找,可以提高效率
  • Testing:提供测试支持
  • Run As:允许一个用户以另一个用户的身份进行登录
  • Concurrency: 支持多线程应用的并发验证,可以自动传递权限
  • Remember me:提供记住密码的功能

Shiro不会去维护用户,维护权限,这些功能需要我们自己手动实现,然后通过接口注入给Shiro

Shiro工作流程和对外API:
image.png

在使用的过程中,应用直接交互的对象是Subject,即Shiro的对外API核心就是Subject

  • Subject:主体,代表了当前“用户”,所有的Subject都绑定到SecurityManager上,与Subject的所有交互也都会转交给SecurityManager,相当于Subject是一个门面,真正的处理执行是由SecurityManager执行的
  • SecurityManager:安全管理器,所有与安全相关的操作都会有它执行,管理者所有的Subject
  • Realm:域,Shiro从Realm获取到安全数据,例如用户信息,角色信息和权限信息,SecurityManager想要验证用户的信息,就要从Realm中获取相对应的信息进行比较,判定是否合法,也需要从Realm获取用户相应的角色/权限进行验证用户是否能够进行操作,相当于是一个DataSource,即安全数据源

Shiro的工作流程就是

  1. 应用代码通过Subject进行认证和授权,同时Subject又委托给SecurityManager
  2. 需要给SecurityManager注入Realm,从而使的SecurityManager能够得到合法的用户及其权限进行判断

内置过滤器

rest:

例子/admins/user/=rest[user],
根据请求的方法,
相当于
/admins/user/
=perms[user:method] ,
其中method为post,get,delete等。

port:

例子/admins/user/**=port[8081],
当请求的url的端口不是8081是跳转到
schemal://serverName:8081?queryString
,其中schmal是协议http或https等,
serverName是你访问的host,8081是url配置里port的端口,
queryString 是你访问的url里的?后面的参数。

perms:

例子/admins/user/=perms[user:add:*],perms
参数可以写多个,多个时必 须加上引号,并且参数之间用逗号分割,
例如 /admins/user/
=perms[“user:add:,user:modify:“],
当有多个参数时必须每个 参数都通过才通过,想当于 isPermitedAll()方法。

roles:

例子/admins/user/=roles[admin],
参数可以写多个,多个时必须加上引号, 并且参数之间用逗号分割,
当有多个参数时,
例如 /admins/user/
=roles[“admin,guest”]
,每个参数通过才算通过,相当于 hasAllRoles()方法。

anon:

例子/admins/**=anon 没有参数,表示可以匿名使用。

authc:

例如/admins/user/**=authc表示需要认证才能使用,没有参数

authcBasic:

例如/admins/user/**=authcBasic没有参数表示httpBasic认证

ssl:

例子/adm
ins/user/**=ssl没有参数,表示安全的url请求,协议为https