배경 : xacml 을 버튼에 대해서도 적용해달란다.
이미 적용된 상태에서 또다른 솔루션 (spring security 등등)을 적용하는 경우 관리 비용이 증가할 것을 우려하여, 한곳에서 관리하고 싶어했다.
구현방향 : interceptor대신 validation을 처리할 controller 와 javascript function 을 제공.
1. javascript로 object (button, image etc.. ) 의 id를 전달.
2. controller에 해당 object 에 대한 권한 여부를 확인
3. 결과에 따라 disable, enable 처리
단점 :
- 버튼 권한까지 서버에게 물어봐야 하니???
- id가 중복될 경우 잘못 처리될 수 있음.
구현내용
1. javascript function
$.authorizeWebElement = function(objectid){
$.ajax({
type: "POST",
dataType: "json",
url: "/authorize" ,
data : {"objectId":objectid},
success: function(data){
$(objectid)[data.message]();
}
});
};
2. controller
public @ResponseBody Map<String, Object> authorize(@RequestParam(value="objectId") String objectId, HttpServletRequest request){
ACManager acm = ACManager.getInstance(this.pdpPath);
List<String> roles = getRoles(request); // get user role from session or persistence data
Map map = new HashMap();
if(acm.evaluate(roles, objectId)){
map.put("message ", " show");
}else{
map.put("message ", " hide");
}
return map;
}
3. screen
function xxx(){
$.authorizeUI("#OnlyAdminAvailableButton");
}
cf) 주의사항
반드시 elementId 는 유일해야한다. ...