当前栏目:java世界

Shiro的认证和授权过程

2023-02-13270

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


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


认证过程主要分为三步:
step1:收集subject的principals(身份)和credentials(凭证)
首先拿到当前currentUser,
Subject currentUser = SecurityUtils.getSubject();
1
1.1利用currentUser可以获取用户相关信息。
例如获取到登录用户的账号和密码

currentUser.getPrincipal()
currentUser.get.Credentials()
1
2
1.1.1判断用户是否拥有某个角色

currentUser.hasRole()
1
1.1.2是否用于某种权限

currentUser.isPermitted()
1
1.2收集用户的principal和credentials。
//注意,此处的username和password是当前登录用户的账号和密码,也就是说是从登录页面传过来的。
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
1
2
step2:提交用于身份验证的身份和凭证。步骤一将收集到的身份和凭证封装为token,我们需要将token提交给shiro,以进行身份验证尝试。
currentUser.login(token);
1
step3:处理成功或失败
如果成功登录,即为验证通过,调用isAuthenticated()将会返回true,但如果登陆失败,例如账号密码错误,账号被锁定等,我们希望能看到失败信息,即抛出异常。

try{
currentUser.login(token);
}catch(UnknownAccountException uae){
//账号错误
...
}catch(IncorrectCredentials ice){
//密码错误
...
}catch(LockedAccountException lae){
//账号被锁定
...
}catch(AuthenticationException ae){
//unexcepted errot?
...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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()即可。
文章知识点与官方知识档案匹配,可进一步学习相关知识
Java技能树首页概览97880 人正在系统学习中

免费领Java全套视频教程+大厂面经

微信名片

关注博
 

相关阅读