2021-11-25 shiro-core IniRealm源码分析(一)

2021SC@SDUSC
IniRealm的类继承关系图
在这里插入图片描述
1.TextConfigurationRealm
在这里插入图片描述
SimpleAccountRealm,它可以用于验证在启动时创建的初始用户、角色和权限对象的基于文本的配置。
每个用户帐户定义指定用户的用户名、密码和角色。 每个角色定义指定一个名称和一个可选的分配权限集合。 可以为用户分配角色,并且可以为角色分配权限。 通过传递关联,每个用户“拥有”他们所有角色的权限。
用户和用户到角色的定义通过setUserDefinitions方法指定,角色到权限的定义通过setRoleDefinitions方法指定。
onInit()

    @Override
    protected void onInit() {
    //将在启动时调用“processDefinitions”
        super.onInit();
        processDefinitions();
    }

setUserDefinitions

	//设置一个换行符 (\n) 分隔的字符串,它根据以下格式定义用户到密码和角色的键/值对:
	//username = password , role1, role2,...
	//以下是这些行的一些示例:
	//root = reallyHardToGuessPassword , administrator jsmith = jsmithsPassword , manager, 
	//engineer, employee abrown = abrownsPassword , qa, employee djones = djonesPassword , 
	//qa, contractor guest = guestPassword
	//参数:
	//userDefinitions – 要解析并转换为 Map.Entry 元素的用户定义
    public void setUserDefinitions(String userDefinitions) {
        this.userDefinitions = userDefinitions;
    }

setRoleDefinitions

	/*
	设置定义角色到权限定义的换行符 (\n) 分隔字符串。
	字符串中的每一行都必须定义一个角色到权限的键/值映射,等号字符表示键/值分隔,如下所示:
	rolename = permissionDefinition1 , permissionDefinition2 , ...
	其中permissionDefinition是一个任意字符串,但人们必须希望使用符合WildcardPermission格式的字
	符串,以便于使用和灵活。 请注意,如果单个权限定义需要在内部以逗号分隔(例如, 
	printer:5thFloor:print,info ),则需要用双引号 (") 将该定义括起来以避免解析错误(例如, 
	"printer:5thFloor:print,info" )。
	注意:如果您有不需要权限关联的角色,请不要将它们包含在此定义中 - 如果角色尚不存在,只需在
	userDefinitions定义角色名称就足以创建该角色。 此属性实际上仅用于配置具有一个或多个分配的权
	限的领域。
	参数:
	roleDefinitions – 要在初始化时解析的角色定义
	*/
    public void setRoleDefinitions(String roleDefinitions) {
        this.roleDefinitions = roleDefinitions;
    }

processUserDefinitions

	//设置此realm的用户认证信息
    protected void processUserDefinitions(Map<String, String> userDefs) {
        if (userDefs == null || userDefs.isEmpty()) {
            return;
        }
        for (String username : userDefs.keySet()) {

            String value = userDefs.get(username);

            String[] passwordAndRolesArray = StringUtils.split(value);

            String password = passwordAndRolesArray[0];

            SimpleAccount account = getUser(username);
            if (account == null) {
                account = new SimpleAccount(username, password, getName());
                add(account);
            }
            account.setCredentials(password);

            if (passwordAndRolesArray.length > 1) {
                for (int i = 1; i < passwordAndRolesArray.length; i++) {
                    String rolename = passwordAndRolesArray[i];
                    account.addRole(rolename);

                    SimpleRole role = getRole(rolename);
                    if (role != null) {
                        account.addObjectPermissions(role.getPermissions());
                    }
                }
            } else {
                account.setRoles(null);
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值