定义Realm(自定义Realm继承AuthorizingRealm即可)
1)UserRealm父类AuthorizingRealm将获取Subject相关信息分成两步:获取身份验证信息 (doGetAuthenticationInfo)及授权信息(doGetAuthorizationInfo)
2)doGetAuthenticationInfo获取身份验证相关信息:首先根据传入的用户名获取User信息;如果user为空,那么抛出没找到账号异常UnknownAccountExecption;如果user找到 但却被锁定了抛出锁定异常LockedAccountException;最后生成AuthenticationInfo信息,交给间接父类AuthenticatingRealm使用CredentialsMatcher进行判断密码是否匹配, 如果不匹配将抛出密码错误异常信息IncorrectCredentialsException;如果密码重试次数太 多将抛出超出重试次数异常ExcessiveAttemptsException;在组装SimpleAuthenticationInfo信息时,需要传入:身份信息(用户名)、凭据(密文密码)、 盐(username+salt),CredentialsMatcher使用盐加密传入的明文密码和此处的密文密码 进行匹配。
3)doGetAuthorizationInfo获取授权信息:PrincipalCollection是一个身份集合,因为只用到了一个Realm,所以直接调用getPrimaryPrincipal得到之前传入的用户名即可;然后根 据用户名调用UserService接口获取角色及权限信息。
AuthenticationInfo的两个作用
1)如果Realm是AuthenticatingRealm子类,则提供给AuthenticatingRealm内部使用的 CredentialsMatcher进行凭据验证;(如果没有继承它需要在自己的Realm中实现验证);
2)提供给SecurityManager来创建Subject(提供身份信息);