Безопасность доступа к объектам БД
Безопасность доступа к объектам БД обеспечивается с помощью безопасных курсоров, наследующих курсоры Celesta.
Получение данных о пользователя
@Override
public UserDTO saveUserData(@RequestBody UserDTO request,
@RequestHeader("Authorization") String sessionId,
HttpServletResponse response) {
UserInfo userInfo = mellophone.user(new SystemCallContext(), sessionId);
return userService.saveUserData(new SystemCallContext(), userInfo, null, request);
}
Пример функции, возвращающей данные о пользователе в случае использование Mellophone
@Override
@CelestaTransaction
public UserInfo user(CallContext context, String sessionId) throws AuthException {
String url = UriComponentsBuilder.fromUriString(properties.getMellophoneUrl())
.path(ISAUTHENTICATED_PATH)
.queryParam(SESID_PARAM, sessionId)
.build()
.toUriString();
try {
UserCursor userCursor = new UserCursor(context);
UserInfo userInfo = this.restTemplate.getForObject(url, UserInfo.class);
String userInfoSid = userInfo.getSid();
if (onBehalfUser != null) {
userInfo.setSid(onBehalfUser.getSid());
userInfo.setLogin(onBehalfUser.getLogin());
userInfo.setOriginatorSid(userInfoSid);
userInfo.setName(onBehalfUser.getFullName());
if (onBehalfUser.isAdmin()) {
userInfo.setAdmin(onBehalfUser.isAdmin());
}
if (onBehalfUser.isTestAdmin()) {
userInfo.setTestAdmin(onBehalfUser.isTestAdmin());
}
userInfo.setOnBehalf(true);
}
else {
userCursor.tryGet(userInfoSid);
userInfo.setOriginatorSid(userInfoSid);
userInfo.setName(userCursor.getFullName());
if (userCursor.getIsAdmin()) {
userInfo.setAdmin(userCursor.getIsAdmin());
}
if (userCursor.getIsTestAdmin()) {
userInfo.setTestAdmin(userCursor.getIsTestAdmin());
}
userInfo.setOnBehalf(false);
}
return userInfo;
} catch (HttpStatusCodeException ex) {
throw new AuthException(ex);
}
}
Работа с безопасным курсором
Пример безопасного курсора
@Log4j2
public class SecureUsersCursor extends UserCursor {
private final UserInfo userInfo;
public SecureUsersCursor(CallContext context, UserInfo userInfo) {
super(context);
this.userInfo = userInfo;
}
@Override
public boolean tryGet(String objectSid) {
if (isAuthorized(objectSid)) {
return super.tryGet(objectSid);
} else {
throw new St2ApiException("User is not authorized for making requested changes");
}
}
private boolean isAuthorized(String objectSid) {
return this.userInfo.getSid().equals(objectSid);
}
}
Пример вызова безопасного курсора
SecureUsersCursor userCursor = new SecureUsersCursor(context, userInfo);