Я столкнулся с серьезной проблемой в моем проекте.Алгоритм был написан.Но я не смог правильно реализовать, написав код на Angular и RxJS.Мой алгоритм:
- Получить идентификатор пользователя (для этого я использовал getUserbyToken (), который сохранил весь userUUID в массив с именем userUUID = [])
- Send to Group APIи убедитесь, что userUUID принадлежит какому количеству групп (для этого я использовал одну и ту же функцию getUserbyToken () с switchMap rxjs и получением groupUUID)
- Сохранение идентификатора группы в массив с именем groupUUID = [];
Затем передайте идентификаторы группы в Role API для проверки роли пользователей.Если несколько групп, то нужно зациклить, чтобы я использовал getRoleOftheUser () с помощью rxJs concatMap ().И получение одного многомерного объекта, и внутри этого объекта есть некоторый объект массива.Это выглядит как на картинке ниже Возвращенный объект после вызова RollAPI Объект идентификатора
И после этого я проверил пользователя Roll, используя условие some if else.Вы можете видеть картинку, что ключи объекта совпадают с моим userUUID.Поэтому, если userUUID соответствует ключам объекта, тогда я проверил значение этих ключей. Если значение равно 'ROLE_ADMIN' в соответствии с UUID ключа, соответствующего пользователю, тогда я хочу вернуть только соответствующий groupUUID, который полностью удовлетворяет условию.К сожалению, это условие if else внутри RxJS оператора не работает должным образом, и я получаю каждый groupUUID, который я передаю через $ {item}.
Результат вывода, которыйпоказывает всем groupUUID, что я являюсь паролем Код:
userUUID = [];
groupUUID = [];
constructor(private http: HttpClient) {}
getUserbyToken() {
const option = {
params: new HttpParams().set('token', this.token)
};
return this.http
.get<any>(`${this.baseURL}/auth/jwt/tokeninfo`, option)
.pipe(
switchMap(res => {
if (!this.userUUID.includes(res.uuid)) {
this.userUUID.push(res.uuid);
}
return this.http
.get<any>(`${this.baseURL}/aaa/users/${res.uuid}/groups`)
.pipe(map(groups => groups));
})
)
.subscribe(result => {
for (let i = 0; i < result.length; i++) {
if (!this.groupUUID.includes(result[i].uuid)) {
this.groupUUID.push(result[i].uuid);
}
}
console.log(this.groupUUID);
console.log( this.userUUID.toString());
});
}
getRoleOftheUser() {
if (this.groupUUID.length > 0) {
of(...this.groupUUID)
.pipe(
mergeMap(item =>
this.http
.get<any>(
`${this.baseURL}/aaa/groups/${item}/effectiveRolesByUser?item=${item}`
)
.pipe(
concatMap(id => {
for (const key in id) {
if (!id.hasOwnProperty(key)) {
continue;
}
if (!this.matchUUID(key) ) {
continue;
} else {
if (id[key] === 'ROLE_ADMIN') {
return item;
} else {
return item;
}
}
}
})
)
),
delay(1000)
)
.subscribe(result => {
console.log(result);
});
}
}
private matchUUID(value) {
const stringifyUserUUID = this.userUUID.toString();
if (value === stringifyUserUUID ) {
return value;
}
}
Может кто-нибудь, пожалуйста, помогите мне решить эту проблему?Спасибо