CCF-CSP 202206-3 角色授权 Java满分题解

严格按照题意模拟
User类type字段表示用户/用户组
使用一个Map存User所对应的role列表先实现通过role来鉴权,再遍历role列表即可

import java.util.*;

class Role{
    String roleName;
    String[] operations;
    String[] resourceClass;
    String[] resourceName;

    @Override
    public String toString() {
        return "Role{" +
                "roleName='" + roleName + '\'' +
                ", operations=" + Arrays.toString(operations) +
                ", resourceClass=" + Arrays.toString(resourceClass) +
                ", resourceName=" + Arrays.toString(resourceName) +
                '}';
    }
}

class RoleUser{
    String roleName;
    String[] users;
}
class User{
    String userName;
    String type;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User userRole = (User) o;
        return Objects.equals(userName, userRole.userName) && Objects.equals(type, userRole.type);
    }

    @Override
    public int hashCode() {
        return Objects.hash(userName, type);
    }
}
public class Main {
    public static boolean judgeRole(Role role,String operation,String reClass,String reName){
        //检查操作
        boolean flag=false;
        for(String str:role.operations){
           // System.out.println(str);
            if(str.equals(operation)||str.equals("*")){
                flag=true;
                break;
            }
        }
        if(!flag){
            return false;
        }
        //检查资源种类
        flag=false;
        for(String str:role.resourceClass){
            if(str.equals(reClass)||str.equals("*")){
                flag=true;
                break;
            }
        }
        if(!flag){
            return false;
        }
        //检查资源名称
        flag=false;
        if(role.resourceName==null||role.resourceName.length==0){
            return true;
        }
        //System.out.println(role.resourceName.length);
        for(String str:role.resourceName){
            if(str.equals(reName)){
                 return true;
            }
        }
        return false;
    }

    public static boolean judgeRoleUser(List<Role> roles,String operation,String reClass,String reName){
        for(Role role:roles){
            //System.out.println(role);
             if(judgeRole(role,operation,reClass,reName)){
                 return true;
             }
        }
        return false;
    }

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        int m=sc.nextInt();
        int q=sc.nextInt();
        Map<String,Role> map=new HashMap<>();
        Map<User,List<Role>> userRoles=new HashMap<>();
        for(int i=0;i<n;i++){
            Role role=new Role();
            role.roleName=sc.next();

            int nv=sc.nextInt();//操作数量
            role.operations=new String[nv];
            for(int j=0;j<nv;j++){
                role.operations[j]=sc.next();
            }
            int no=sc.nextInt();
            role.resourceClass=new String[no];
            for(int j=0;j<no;j++){
                role.resourceClass[j]=sc.next();
            }
            int nn=sc.nextInt();
            if(nn!=0){
                role.resourceName=new String[nn];
                for(int j=0;j<nn;j++){
                    role.resourceName[j]=sc.next();
                }
            }else{
                role.resourceName=null;
            }

            //System.out.println(role);
            map.put(role.roleName,role);
        }
        for(int i=0;i<m;i++){
            String roleName=sc.next();
            //System.out.println(roleName);
            Role role=map.get(roleName);
            int ns=sc.nextInt();
            for(int j=0;j<ns;j++){
                String ug=sc.next();
                String ugName=sc.next();
                User user=new User();
                user.userName=ugName;
                user.type=ug;
                List<Role> roles=userRoles.getOrDefault(user,new ArrayList<>());
                roles.add(role);
                userRoles.put(user,roles);
            }
        }
//        for(User user:userRoles.keySet()){
//            System.out.println(user.userName+" "+user.type+" "+userRoles.get(user).size());
//        }
        int[] res=new int[q];
        for(int i=0;i<q;i++){

            String userName=sc.next();
            int ng=sc.nextInt();
            String[] groups=new String[ng];
            for(int j=0;j<ng;j++){
                groups[j]=sc.next();
            }
            String operation=sc.next();
            String reClass=sc.next();
            String reName=sc.next();

            //找到这个用户
            User user=new User();
            user.userName=userName;
            user.type="u";
            List<Role> list=userRoles.get(user);
            if(list!=null&&!list.isEmpty()){
                if(judgeRoleUser(list,operation,reClass,reName)){
                    res[i]=1;
                    continue;
                }
            }
            boolean flag=false;
            for(String group:groups){
                user.userName=group;
                user.type="g";
                list=userRoles.get(user);
                if(list!=null&&!list.isEmpty()){
                    if(judgeRoleUser(list,operation,reClass,reName)){
                        flag=true;
                        break;
                    }
                }
            }
            if(flag){
               res[i]=1;
            }else{
               res[i]=0;
            }

        }
        for(int i:res){
            System.out.println(i);
        }
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值