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

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);
    }

}

测试结果
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值