AuthenticationToken
AuthenticationToken用于收集用户提交的身份(如用户名)及凭据(如密码):
扩展接口RememberMeAuthenticationToken
提供了boolean isRememberMe()
实现“记住我”的功能;
扩展接口HostAuthenticationToken
提供了String getHost()
方法用于获取用户“主机”的功能。
Shiro提供了一个直接拿来用的UsernamePasswordToken
,用于实现用户名/密码Token
组,另外其实现了RememberMeAuthenticationToken
和HostAuthenticationToken
,可以实现记住我及主机验证的支持。
我们可以实现自己的AuthenticationToken
,例如想要统一账号登录,这个账号可能是平台唯一账号:
AuthenticationInfo
AuthenticationInfo
有两个作用:
- 如果Realm是
AuthenticatingRealm
子类,则提供给AuthenticatingRealm
内部使用的CredentialsMatcher
进行凭据验证; - 提供给SecurityManager来创建Subject(提供身份信息)。
说一下第一个功能。
一般我们在实现Realm时,会实现doGetAuthenticationInfo
方法,获取认证信息:
然后AuthenticatingRealm
内部会使用这个认证信息进行凭证校验:
我们可以实现自己的AuthenticationInfo
:
其中PrincipalCollection
用于聚合这些身份信息,一般用SimplePrincipalCollection
就好。
当然,还要写一个对应的比对CredentialsMatcher
,用来对MyAuthenticationInfo
进行凭证校验:
在MyRealm的doGetAuthenticationInfo
方法中,返回一个MyAuthenticationInfo
,将MyAuthenticationToken
的account赋值给MyAuthenticationInfo
的credentials:
这样在校验时就能成功了。
AuthorizationInfo
AuthorizationInfo包含了授权信息,当我们使用AuthorizingRealm
时,如果身份验证成功,在进行授权时就通过doGetAuthorizationInfo
方法获取角色/权限信息用于授权验证。
Shiro提供了一个实现SimpleAuthorizationInfo
,大多数时候使用这个即可。
Subject
Subject是Shiro的核心对象,基本所有身份验证、授权都是通过Subject完成。
身份信息获取
|
|
身份验证
|
|
通过login
登录,如果登录失败将抛出相应的AuthenticationException
,如果登录成功调用isAuthenticated
就会返回true,即已经通过身份验证;
如果isRemembered
返回true,表示是通过记住我功能登录的而不是调用login方法登录的。isAuthenticated
/isRemembered
是互斥的,即如果其中一个返回true,另一个返回false。
角色授权验证
|
|
hasRole*
进行角色验证,验证后返回true/false;而checkRole*
验证失败时抛出AuthorizationException
异常。
权限授权验证
|
|
isPermitted*
进行权限验证,验证后返回true/false;而checkPermission*
验证失败时抛出AuthorizationException
。
会话
|
|
类似于Web中的会话。如果登录成功就相当于建立了会话,接着可以使用getSession获取;如果create=false如果没有会话将返回null,而create=true如果没有会话会强制创建一个。
退出
|
|
参考:
第六章 Realm及相关对象——《跟我学Shiro》
Apache Shiro Reference Documentation