WebApplicationContext ctx = WebApplicationContextUtils.
getWebApplicationContext((ServletContext) context.get(SERVLET_CONTEXT));
HttpServletRequest request = (HttpServletRequest)context.get(HTTP_REQUEST);
HttpServletResponse response = (HttpServletResponse)context.get(HTTP_RESPONSE);
OperatingUnitDao operatingUnitDao = (OperatingUnitDao)ctx.getBean("loxiaOperatingUnitDao");
String strMethod = invocation.getProxy().getMethod();
Method m = getActionMethod(action.getClass(), strMethod);
Acl acl = m.getAnnotation(Acl.class);
if(acl == null)
acl = action.getClass().getAnnotation(Acl.class);
boolean needCheck = true;
boolean needCredential = true;
if(acl == null){
needCheck = false;
needCredential = false;
}else if(acl.value().length == 0
|| Arrays.asList(acl.value()).contains(""))
needCheck = false;
if(logger.isDebugEnabled()){
if(needCredential)
logger.debug("Credential is required.");
logger.debug("Current ACL:{}", needCheck ? acl : "");
}
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if(needCredential && authentication == null){
logger.error("Session timeout.");
throw new BusinessException(PreserveErrorCode.SESSION_TIMEOUT);
}
if(needCheck){
BaseProfileAction act = (BaseProfileAction)action;
LoxiaUserDetails userDetails = (LoxiaUserDetails)authentication.getPrincipal();
logger.debug("Current Principal:" + userDetails);
String entryAcl = act.getAcl();
if(entryAcl != null){
userDetails.setCurrentOu(null);
logger.debug("Function Entrance... Organization need to repick");
for(GrantedAuthority auth: userDetails.getAuthorities()){
LoxiaGrantedAuthority lauth = (LoxiaGrantedAuthority)auth;
if(lauth.getAuthority().equals(entryAcl)){
userDetails.setCurrentAuthority(lauth);
break;
}
}
if(userDetails.getCurrentAuthority() == null ||
userDetails.getCurrentAuthority().getOuIds().size() == 0){
logger.error("No sufficicent privilege.");
throw new BusinessException(PreserveErrorCode.NO_SUFFICICENT_PRIVILEGE);
}else{
if(userDetails.getCurrentAuthority().
getOuIds().size() == 1){
userDetails.setCurrentOu(operatingUnitDao.getByPrimaryKey(
userDetails.getCurrentAuthority().getOuIds().iterator().next()));
}else{
logger.debug("Redirect Invocation");
String url = request.getRequestURI();
Enumeration<String> paramNames = request.getParameterNames();
StringBuffer paramsSb = new StringBuffer();
while (paramNames.hasMoreElements()) {
String name = (String) paramNames.nextElement();
if (!"acl".equalsIgnoreCase(name)){
paramsSb.append(name + "=" + request.getParameter(name) + "&");
}
}
if (paramsSb.length() > 0){
paramsSb.deleteCharAt(paramsSb.length()-1);
url = url + "?" + paramsSb.toString();
}
request.getSession().setAttribute(BaseAction.FOLLOWING_URL_AFTER_OPERATING_UNIT_PICKUP, url);
response.sendRedirect(request.getContextPath() + "/operatingunitpickup.do");
return null;
}
}
}else{
if(act.getSelectedOuId() != null){
//set Current OperatingUint in up
userDetails.setCurrentOu(operatingUnitDao.getByPrimaryKey(act.getSelectedOuId()));
}else{
if(!userDetails.checkAuthority(acl.value())){
logger.error("No sufficicent privilege.");
throw new BusinessException(PreserveErrorCode.NO_SUFFICICENT_PRIVILEGE);
}