package org.fastcatsearch.http.action;
import java.io.Writer;
import java.util.Map;
import org.fastcatsearch.http.ActionAuthority;
import org.fastcatsearch.http.ActionAuthorityLevel;
import org.fastcatsearch.http.SessionInfo;
import org.fastcatsearch.util.ResponseWriter;
public abstract class AuthAction extends ServiceAction {
public final static String AUTH_KEY = "__auth";
private ActionAuthority authority;
private ActionAuthorityLevel authorityLevel;
abstract public void doAuthAction(ActionRequest request, ActionResponse response) throws Exception;
@Override
public void doAction(ActionRequest request, ActionResponse response) throws Exception {
writeHeader(response);
if(session == null){
return;
}
Object obj = session.getAttribute(AUTH_KEY);
logger.trace("session obj = {}", obj);
try {
if (obj == null) {
// 인증 안되어 있음.
doNotAuthenticatedResult(request, response, "Not Authenticated.");
} else {
SessionInfo sessionInfo = (SessionInfo)obj;
Map<ActionAuthority, ActionAuthorityLevel> authorityMap = sessionInfo.getAuthorityMap();
ActionAuthorityLevel currentLevel = authorityMap.get(authority);
if (currentLevel == null) {
currentLevel = ActionAuthorityLevel.NONE;
}
if(logger.isTraceEnabled()) {
logger.trace(
"authority:{} requireLevel:{} / currentLevel:{} [{}]",
authority, authorityLevel, currentLevel,
currentLevel.isLargerThan(authorityLevel));
}
if (authority == ActionAuthority.NULL
|| (authority != ActionAuthority.NULL && currentLevel
.isLargerThan(authorityLevel))) {
logger.trace("authorized");
doAuthAction(request, response);
} else {
doNotAuthenticatedResult(request, response, "Not Authorized.");
}
}
} finally {
Writer writer = response.getExistWriter();
if(writer != null) {
writer.close();
}
}
}
private void doNotAuthenticatedResult(ActionRequest request, ActionResponse response, String message) throws Exception {
Writer writer = response.getWriter();
ResponseWriter resultWriter = getDefaultResponseWriter(writer);
resultWriter.object().key("error").value(message).endObject();
resultWriter.done();
writer.close();
}
public void setAuthority(ActionAuthority authority, ActionAuthorityLevel authorityLevel) {
this.authority = authority;
this.authorityLevel = authorityLevel;
}
}