《跟我学shiro》随笔(1)

本文是《跟我学Shiro》系列的第一篇,介绍了Shiro框架的基础知识,包括Shiro的功能模块、身份验证流程、授权概念以及自定义Realm、AuthenticationStrategy的实现方法。还探讨了权限的2进制表示和INI配置中的依赖注入。
摘要由CSDN通过智能技术生成

shiro简介

shiro能做什么?

答:shiro可以帮助我们完成认证,授权,加密,会话管理,与web集成,缓存等.

shiro功能模块有哪些?

答:Authentication:身份认证/登录,验证用户是不是拥有相应的身份.
Authorization:验证某个已认证的用户是否拥有某个权限.Session Manager:会话管理.Cryptography:加密.Web Support:web支持.Caching:缓存.Concurrency:多线程应用的并发验证.Testing:提供测试支持.Run As:允许一个用户假装为另一个用户的身份进行访问.Remember Me:记住我,一次登陆后,下次再来不用登录.

一个最简单的shiro应用是怎样运行的?

答:应用代码通过subject来进行认证和授权,而subject又委托给securityManager.我们需要给shiro的SecurityManager注入Realm,从而让SecurityManager能得到合法的用户及其权限进行判断.

身份验证

如何进行身份验证?

答:在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro.
1.首先调用Subject.login(token)进行登录,其会自动委托给SecurityManager,调用之前必须通过SecurityUtils.setSecurityManager()设置.
2.SecurityManager负责真正的身份验证逻辑,它会委托给Authenticator进行身份验证.
3.Authenticator才是真正的身份验证者,Shiro API中核心的身份认证入口点,此处可以自定义插入自己的实现.
4.Authenticator可能会委托给相应的AuthenticationStrategy进行多Realm身份验证,默认ModularRealmAuthenticator会调用AuthenticationStrategy进行多realm身份验证.
5.Authenticator会把相应的token传入realm,从realm获取身份验证信息

realm的自定义实现

答:realm的接口有三个函数:
String getName():返回一个唯一的realm名字.
boolean support(AuthenticationToken token):判断此realm是否支持此Token.
AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException:根据Token获取认证信息.
将这三个函数重写即可自定义实现.

Authenticator和AuthenticationStrategy的作用

答:Authenticator的职责是验证用户账号,是shiro API中身份验证核心的入口点.SecurityManager继承了Authenticator,另外还有一个ModularRealmAuthenticator实现,验证规则通过AuthenticationStrategy接口指定.
AuthenticationStrategy的接口实现如下:
FirstSuccessfulStrategy:只要有一个realm验证成功,就返回成功的那一个认证信息,后面的realm不验证.
AtLeastOneSuccessfulStrategy:只要有一个realm验证成功,就返回所有realm的认证信息.
AllSuccessfulStrategy:只有所有realm验证成功才返回认证信息.
ModuleRealmAuthenticator默认使用的策略是AtleastOneSuccessfulStrategy.

如何自定义AuthenticationStrategy

要重写如下方法:
//在所有realm验证之前调用
AuthenticationInfo beforeAllAttempts(Collection<? extends Realm>realms,AuthenticationToken token)throws AuthenticationException{}
//在每个realm之前调用
AuthenticationInfo beforeAttempt(Realm realm, AuthenticationToken token,AuthenticationInfo aggregate)throws AuthenticationException{}
//在每个realm之后调用
AuthenticationInfo afterAttempt(Realm realm,AuthenticationToken token,AuthenticationInfo singleRealmInfo,AuthenticationInfo aggregateInfo,Throwable t)throws AuthenticationException{}
//在所有Realm之后调用
AuthenticationInfo afterAllAttempts(AuthenticationToken token,AuthenticationInfo aggregate)throws AuthenticationException{}

授权

什么叫授权?如何实现授权?

授权也叫访问控制,即在应用中控制谁能访问哪些资源.
在授权中需了解的几个关键对象:Subject(主体),Resource(资源),Permission(权限),Role(角色).
shiro支持三种方式的授权:1.编程式授权Subject subject=SecurityUtils.getSubject();
if(subject.hasRole("admin")){
//有权限
}else{
//无权限}
2.注解式授权@RequiresRoles("admin")
public void hello(){//有权限}
3.jsp标签注解<shiro:hasRole name="admin">
<!--有权限-->
</shiro:hasRole>

关于隐式角色的授权方式和显示角色的授权方式

关于隐式角色的授权可在ini配置文件中声明
[users]
用户名=密码,角色1,角色2,...
关于显示角色的授权
[users]
zhang=123,role1,role2
[roles]
role1=user:create,user:update
role2=user:delete

关于permission

字符串通配符权限
规则:“资源标识符:操作:对象实例ID(可省略)”
system:user拥有的权限如下:create,update,delete,view

关于授权的实现流程

  1. 首先由subject.isPermitted/hasRole接口函数委托给SecurityManager,再由SecurityManager转给Authorizer.
  2. Authorizer再通过PermissionResolver把字符串转换为相应的Permission实例.
  3. 在进行授权前,会调用相应的Realm获取subject相应的角色/权限用于匹配传入的角色/权限.
  4. Authorizer会判断realm的角色/权限是否和传入的匹配,若有多个Realm,会委托给ModularRealmAuthorizer进行循环判断.

Authorizer,PermissionResolver及RolePermissionResolver的关系

Authorizer的职责是进行授权.PermissionResolver用于解析权限字符串到Permission实例,而RolePermissionResolver用于根据角色解析相应的权限集合.

2进制表示权限

1(0001):新增
2(0010):修改
4(0100):删除
8(1000):查看

INI配置

shiro支持哪些依赖注入?

1.public空参数构造方法注入
2.setter注入.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值