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);
}
}
测试结果