简介
Shiro相对于Spring security来说是一个较为轻量级的java安全框架,我们在日常的代码开发中shiro的功能就已经足够我们使用了。
Shiro可以帮助我们在开发应用中完成认证,授权,加密,会话管理与Web集成和缓存的功能。
Shiro的功能API也是极其简单的,基本功能点如图所示
- Authentication:身份认证/登录,验证用户是否拥有对应的身份
- Authorization:授权,权限验证,验证某个已经认证的用户是否拥有某个权限
- Session Manager:会话管理,用户登录后就是一次会话,所有信息都保存在会话中
- Cryptography:加密,保护数据的安全性,如密码的加密存储
- Web Support:Web支持,可以集成到Web应用中
- Caching:缓存,用户登录之后,其用户信息和权限,角色等信息不用每次都去查找,可以提高效率
- Testing:提供测试支持
- Run As:允许一个用户以另一个用户的身份进行登录
- Concurrency: 支持多线程应用的并发验证,可以自动传递权限
- Remember me:提供记住密码的功能
Shiro不会去维护用户,维护权限,这些功能需要我们自己手动实现,然后通过接口注入给Shiro
Shiro工作流程和对外API:
在使用的过程中,应用直接交互的对象是Subject,即Shiro的对外API核心就是Subject
- Subject:主体,代表了当前“用户”,所有的Subject都绑定到SecurityManager上,与Subject的所有交互也都会转交给SecurityManager,相当于Subject是一个门面,真正的处理执行是由SecurityManager执行的
- SecurityManager:安全管理器,所有与安全相关的操作都会有它执行,管理者所有的Subject
- Realm:域,Shiro从Realm获取到安全数据,例如用户信息,角色信息和权限信息,SecurityManager想要验证用户的信息,就要从Realm中获取相对应的信息进行比较,判定是否合法,也需要从Realm获取用户相应的角色/权限进行验证用户是否能够进行操作,相当于是一个DataSource,即安全数据源
Shiro的工作流程就是
- 应用代码通过Subject进行认证和授权,同时Subject又委托给SecurityManager
- 需要给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