Например, пользователь «А» может иметь роль администратора в учетной записи «dev». ' и может иметь роль только для чтения в учетной записи "test".
У нас есть GenericRepository, который наследуется как MemberGroupRepository, так и MemeberRoleRepository.
GenericRepository.java
Код: Выделить всё
public class GenericRepository {
private MongoOperations mongoOperations; // Holds the information of mongo db connection
// code logic
}
Код: Выделить всё
@Repository
public class MemberGroupRepository extends GenericRepository {
// code logic
}
Код: Выделить всё
@Repository
public class MemberRoleRepository extends GenericRepository {
// code logic
}
Он отлично работает, когда мы входим в систему вручную с 2-3 параллельными подключениями. Но все идет совсем не так, когда происходит одновременный вход в систему и дальнейшие вызовы GET API. Мы используем JMeter для измерения производительности, и если мы создаем 100 одновременных подключений, мы наблюдаем следующие проблемы.
MongoOperations элемента MemberGroupRepository неожиданно становится нулевой. Я прочитал документацию по безопасности Spring, изучил множество форумов и попробовал несколько вещей (как показано ниже), но ни одна из них не сработала.
- Настройка SecurityContextRepository
Код: Выделить всё
this.setSecurityContextRepository(new DelegatingSecurityContextRepository(
new RequestAttributeSecurityContextRepository(), new HttpSessionSecurityContextRepository()));
- Создать EmptyContext при успешной аутентификации
Код: Выделить всё
@Override
protected void successfulAuthentication(
HttpServletRequest request,
HttpServletResponse response,
FilterChain chain,
Authentication authResult)
throws IOException, ServletException {
// Following 3 lines are newly added
SecurityContext context = SecurityContextHolder.createEmptyContext();
context.setAuthentication(authResult);
SecurityContextHolder.setContext(context);
// SecurityContextHolder.getContext().setAuthentication(authResult); --> This is the old one
chain.doFilter(request, response);
}
т.е. Каждый запрос имеет свою собственную версию переменной MemberGroupRepository.mongoOperations, и любое изменение, внесенное любым потоком, повлияет только на его собственную версию, но не на переменные других потоков.
В чем может быть причина этой проблемы? Любое предложение будет оценено.
Подробнее здесь: https://stackoverflow.com/questions/786 ... g-boot-via