2021-11-20 shiro-core SimpleAccountRealm源码分析(三)

2021SC@SDUSC
SimpleAccountRealm的类继承关系图
2021-11-20 shiro-core SimpleAccountRealm源码分析(三)
SimpleAccountRealm
SimpleAccountRealm是Realm接口的一个简单实现,它使用一组配置的用户帐户和角色来支持身份验证和授权。 每个帐户条目指定用户的用户名、密码和角色。 角色还可以映射到权限并与用户关联。
用户账号和角色存储在内存中的两个Map中,因此预计两者的总数都不够大。

SimpleAccountRealm变量
2021-11-20 shiro-core SimpleAccountRealm源码分析(三)
users:一个Map,是用户名和用户的对应关系,用户包括了用户名,用户密码,用户角色等信息
roles:一个Map,是角色名和角色的对应关系,角色包括了角色名,角色权限等信息
USERS_LOCK:users的读写锁
ROLES_LOCK:roles的读写锁

SimpleAccountRealm函数方法
2021-11-20 shiro-core 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);
    }

}

测试结果
2021-11-20 shiro-core SimpleAccountRealm源码分析(三)

上一篇:Shiro流程简析 过滤器


下一篇:02-shiro中的核心架构