JS 위젯에서 mx.data.commit으로 저장했더니 오류 메시지 없이 값이 반영되지 않았다. 원인은 엔티티 접근 규칙이었다. 저장과 삭제를 Microflow 호출로 바꾸고, 권한은 화면과 서버 두 곳에서 따로 걸었다.
문제
관리자 계정에서는 저장되는데 일반 사용자는 저장 버튼을 눌러도 값이 그대로
원인
클라이언트 커밋은 사용자 역할의 엔티티 접근 규칙을 그대로 따름. 쓰기 권한이 없는 속성은 반영되지 않음
해결
저장과 삭제는 Microflow로 처리하고, 화면 노출 제어와 서버 권한을 분리해서 설정
클라이언트 커밋과 Microflow 호출의 차이
| 구분 | mx.data.commit | Microflow 호출 |
|---|---|---|
| 권한 기준 | 사용자 역할의 엔티티 접근 규칙 | Microflow 설정에 따름 |
| 검증 로직 | 클라이언트에 흩어짐 | 서버 한 곳에 모임 |
| 실패 확인 | 원인 파악이 어려움 | 로그와 오류 메시지로 확인 |
| 추가 처리 | 별도 구현 필요 | 이력 기록, 메일 발송을 같은 흐름에 |
파라미터는 비영속 객체에 담아 넘긴다
mx.data.action은 문자열을 Microflow 파라미터로 바로 넘길 수 없다. 비영속(non-persistent) 엔티티를 하나 만들어 값을 담고, 그 객체를 넘긴다.
JS 위젯
mx.data.create비영속 파라미터 객체 생성
obj.set날짜 범위, 입력값 담기
guid 전달
서버
Microflow파라미터 객체를 받아 검증, 저장
DB
JS: 파라미터 객체로 Microflow 호출
function callWithParam(mfName, values, onDone) {
mx.data.create({
entity: 'Issue.SaveParam', // 비영속 엔티티
callback: function (p) {
Object.keys(values).forEach(function (k) { p.set(k, values[k]); });
mx.data.action({
params: { actionname: mfName, applyto: 'selection', guids: [p.getGuid()] },
callback: function (result) { onDone(null, result); },
error: function (err) { onDone(err); }
});
},
error: function (err) { onDone(err); }
});
}
callWithParam('Issue.ACT_SaveIssue', {
IssueGuid: currentGuid,
Title: titleInput.value,
DueDate: dueInput.value
}, function (err) {
if (err) { showMessage('저장하지 못했습니다.'); return; }
reloadList();
});비영속 엔티티에도 접근 규칙이 필요하다비영속 엔티티라도 사용자 역할에 생성, 쓰기 권한을 주지 않으면 obj.set이 동작하지 않는다.
권한은 두 곳에서 따로 건다
화면
버튼 숨김, 입력 잠금사용성을 위한 제어
판단 기준로그인 사용자 역할, 담당자 여부
우회 가능
서버
엔티티 접근 규칙역할별 읽기, 쓰기 범위
Microflow 내부 확인담당자 본인인지 다시 확인
| 역할 | 화면 | 서버 |
|---|---|---|
| 관리자 | 전체 편집 | 전체 CRUD |
| 조치 담당자 | 조치 내용 탭만 편집 | 조치 관련 속성만 쓰기, Microflow에서 담당자 본인 확인 |
| 일반 | 조회만 | 읽기만 |
JS: 화면 노출 제어
var roles = mx.session.getUserRoleNames ? mx.session.getUserRoleNames() : [];
var isAdmin = roles.indexOf('Admin') > -1;
function canEditClear(row) {
return isAdmin || row.clearPersonId === currentUserId;
}모듈별 관리자 역할모듈이 여러 개면 관리자 역할을 모듈마다 나누는 편이 안전했다. 한 모듈의 관리자에게 다른 모듈 엔티티 쓰기 권한이 같이 열리는 것을 막을 수 있다.
점검 목록
- JS에서 영속 객체를 직접 commit, remove하는 코드가 남아 있지 않은가
- Microflow의 "Apply entity access" 설정을 의도대로 했는가
- 화면에서 숨긴 기능을 서버에서도 막았는가
- 일반 사용자 계정으로 저장, 삭제를 직접 해 봤는가
시리즈 목차 16편
- PI 담당자가 로우코드로 사내 시스템을 직접 만들고 운영한 기록
- Mendix Datagrid2 대신 HTMLSnippet과 JS로 목록 화면 만들기
- Mendix SPA에서 HTMLSnippet JS가 꼬이는 이유: 이벤트 중복과 DOM 공존
- Mendix mx.data.commit이 조용히 실패할 때 (현재 글)
- Mendix Java heap OOM 추적기: base64 이미지 컬럼
- Mendix 커밋 롤백, 용량 문제가 아니었다: FileDocument 전환기
- Mendix 첫 접속 지연 줄이기: 워밍업과 캐시
- Mendix SAML SSO 자동 로그인과 딥링크 유지
- Mendix Studio Pro에서 안 바뀌는 스타일 main.scss로 바꾸기
- Mendix MPK 파일 열어서 마이크로플로우 구조 보기
- SSO 로그 테이블로 MAU와 재방문율 구하는 SQL
- Mendix DateTime이 BI 도구에서 하루 빠르게 보이는 이유
- 대시보드 숫자가 틀렸을 때 확인하는 순서
- 보기 좋은 대시보드에서 할 일을 알려주는 대시보드로
- 여러 점검 시스템을 하나로 합치는 데이터 모델
- 데이터 비전공자에게 분석 결과 보고하기