2021SC@SDUSC
SimpleAccountRealm的类继承关系图
SimpleAccountRealm
SimpleAccountRealm是Realm接口的一个简单实现,它使用一组配置的用户帐户和角色来支持身份验证和授权。 每个帐户条目指定用户的用户名、密码和角色。 角色还可以映射到权限并与用户关联。
用户账号和角色存储在内存中的两个Map中,因此预计两者的总数都不够大。
SimpleAccountRealm变量
users:一个Map,是用户名和用户的对应关系,用户包括了用户名,用户密码,用户角色等信息
roles:一个Map,是角色名和角色的对应关系,角色包括了角色名,角色权限等信息
USERS_LOCK:users的读写锁
ROLES_LOCK:roles的读写锁
SimpleAccountRealm函数方法
函数方法 | 功能 |
---|---|
getUser(String username) | 根据username获取到users中对应的用户 |
accountExists(String username) | 判断用户名为username的用户是否存在 |
addAccount() | 创建一个account,并 向users表中添加一个<username,account>的映射关系 |
getUsername(SimpleAccount account) | 获取该用户的用户名 |
add(SimpleAccount account) | 向users中添加一个映射关系 |
getRole(String rolename) | 根据角色名称获取角色 |
roleExists(String name) | 根据角色名称判断是否存在此角色 |
addRole(String name) | 添加一个角色 |
add(SimpleRole role) | 添加一个角色 |
doGetAuthenticationInfo(AuthenticationToken token) | 获取提交主体的认证信息 |
doGetAuthorizationInfo(PrincipalCollection principals) | 从数据源中获取存储的认证信息 |
SimpleAccountRealm测试
package com.shiro.test; import org.apache.shiro.SecurityUtils; import org.apache.shiro.authc.UsernamePasswordToken; import org.apache.shiro.mgt.DefaultSecurityManager; import org.apache.shiro.realm.SimpleAccountRealm; import org.apache.shiro.subject.Subject; import org.junit.Before; import org.junit.Test; public class AuthenticationTest { SimpleAccountRealm simpleAccountRealm = new SimpleAccountRealm(); @Before public void addUser(){ simpleAccountRealm.addAccount("Mark","123456","admin","user"); simpleAccountRealm.addAccount("Sam","123456","admin"); simpleAccountRealm.addAccount("Adam","123456","user"); } public void testAuthentication(UsernamePasswordToken token){ //1.构建securityManager环境 DefaultSecurityManager defaultSecurityManager = new DefaultSecurityManager(); defaultSecurityManager.setRealm(simpleAccountRealm); //2.主体提交认证请求 SecurityUtils.setSecurityManager(defaultSecurityManager); Subject subject = SecurityUtils.getSubject(); try { subject.login(token); System.out.println(token.getUsername()+" isAuthenticated:"+subject.isAuthenticated()); subject.checkRole("admin"); subject.logout(); System.out.println(token.getUsername()+" isAuthenticated:"+subject.isAuthenticated()); }catch (org.apache.shiro.authc.UnknownAccountException e){ System.out.println("用户名"+token.getUsername()+"不存在"); }catch (org.apache.shiro.authc.IncorrectCredentialsException e){ System.out.println("密码错误"); }catch (org.apache.shiro.authz.UnauthorizedException e){ System.out.println("用户权限不足"); } } @Test public void testAuthentication(){ UsernamePasswordToken token1 = new UsernamePasswordToken("Mark","123456"); UsernamePasswordToken token2 = new UsernamePasswordToken("San","123456"); UsernamePasswordToken token3 = new UsernamePasswordToken("Adam","123456"); testAuthentication(token1); //用户名不存在,抛出异常 testAuthentication(token2); //用户密码错误,抛出异常 testAuthentication(token3); } }
测试结果