Shiro的认证和授权过程

Shiro主要包括四大部分:认证,授权,session管理和加密

在这里插入图片描述

1.认证:是一个身份验证的过程,要证明他们的身份,需要提供principals(身份)和credentials(凭证)。身份有多种,包括邮箱,账号等能表示subject身份的信息,凭证有密码,指纹,数字证书等。一般就是登录,获取账号和密码。

在这里插入图片描述

认证过程主要分为三步:

step1:收集subject的principals(身份)和credentials(凭证)

首先拿到当前currentUser,

Subject currentUser = SecurityUtils.getSubject();
1.1利用currentUser可以获取用户相关信息。

例如获取到登录用户的账号和密码

currentUser.getPrincipal()
currentUser.get.Credentials()

1.1.1判断用户是否拥有某个角色

currentUser.hasRole()

1.1.2是否用于某种权限

currentUser.isPermitted()
1.2收集用户的principal和credentials。
//注意,此处的username和password是当前登录用户的账号和密码,也就是说是从登录页面传过来的。
UsernamePasswordToken token = new UsernamePasswordToken(username, password);

step2:提交用于身份验证的身份和凭证。步骤一将收集到的身份和凭证封装为token,我们需要将token提交给shiro,以进行身份验证尝试。

currentUser.login(token);

step3:处理成功或失败

如果成功登录,即为验证通过,调用isAuthenticated()将会返回true,但如果登陆失败,例如账号密码错误,账号被锁定等,我们希望能看到失败信息,即抛出异常。

try{
currentUser.login(token);
}catch(UnknownAccountException uae){
//账号错误
...
}catch(IncorrectCredentials ice){
//密码错误
...
}catch(LockedAccountException lae){
//账号被锁定
...
}catch(AuthenticationException ae){
//unexcepted errot?
...
}

2.授权,主要是检查用户的权限。

在这里插入图片描述

step1:subject调用hasRole(),cgeckRole(),isPermitted(),或checkPermission()

step2:subject通常是一个委托给securityManager的DeletingSubject或者子类,通过调用securityManager的hasRole(),cgeckRole(),isPermitted(),或checkPermission()的变种方法(securityManager实现了Authorizer接口)

step3:securityManager委托给了Authorizer实例,通过调用authorizer实例的hasRole(),cgeckRole(),isPermitted(),或checkPermission()来实现授权。authorizer实例默认是ModularRealmAuthorizer实例,支持在协调一个或多个realm。

step4检查每个配置的realm是否实现了相同的Authorizer接口,是如果是,则调用自己的hasRole ()、 checkRole () 、 isPermitted () 或 checkPermission()方法。

3.Realm

Realm是一个component,可以访问应用程序的安全数据,如用户,角色,权限等,然后将这些数据转换成Shiro可以理解的格式。Realm本质上就是一个security-specific Dao。由于realm访问的数据既有认证数据,例如账号密码,又有授权数据,例如权限和角色,所以每一个Realm可以执行认证和授权操作。

4.其他

4.1Rembered 和Authenticated的区别

Rembered的subject不是匿名的,该subject的身份不为空,是在前一个session期间身份认证过程中记住的,调用subject.isRembered()将返回true。
Authenticated是在当前session期间验证通过的subject,调用isAuthenticated()将返回true.

4.2为什么要设置Rembered 和Authenticated?

为了安全。记住我功能为了方便登录,只是说明是上一次验证过的用户,当其他人使用记住我登录时我们的账号时,就不应该有操作敏感信息的权限,例如查看财务信息等,这时必须要认证,也就是输入账号密码才能操作。用记住我登录的只有访问普通信息的权限。

4.3Logout(注销)

当subject完成所有交互后需要释放所有身份信息,此时调用current.logout()即可。
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值