严格按照题意模拟
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);
}
}
}