restx.security.SecurityModule Maven / Gradle / Ivy
package restx.security;
import com.google.common.base.Optional;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.IOException;
import restx.RestxContext;
import restx.RestxHandler;
import restx.RestxHandlerMatch;
import restx.RestxRequest;
import restx.RestxRequestMatch;
import restx.RestxResponse;
import restx.RestxRoute;
import restx.StdRestxRequestMatch;
import restx.WebException;
import restx.common.RestxConfig;
import restx.config.SettingsKey;
import restx.factory.AutoStartable;
import restx.factory.Module;
import restx.factory.Provides;
import restx.factory.When;
import restx.http.HttpStatus;
import restx.security.RestxSession.Definition.EntryCacheManager;
import javax.inject.Named;
/**
* Date: 17/11/13
* Time: 17:55
*/
@Module(priority = 100)
public class SecurityModule {
private static final Logger logger = LoggerFactory.getLogger(SecurityModule.class);
public static final String ENTRY_CACHE_MANAGER = "EntryCacheManager";
public static interface SecuritySettings {
@SettingsKey(key = "restx.sessions.stats.limit", defaultValue = "100",
doc = "The maximum number of sessions data to keep in memory for statistics in the monitor view")
int sessionsLimit();
}
@Provides
@Named("restx.activation::restx.security.RestxSessionBareFilter::RestxSessionBareFilter")
public String disableBareFilter() {
return "false";
}
@Provides @Named("Sessions")
public Sessions session(SecuritySettings settings) {
return new Sessions(settings.sessionsLimit());
}
// this makes Sessions part of the auto started components, thus making it server wide.
@Provides
public AutoStartable startSessions(@Named("Sessions") Sessions sessions) {
return new AutoStartable() {
@Override
public void start() {
logger.debug("starting sessions statistics");
}
};
}
// provides Settings instead of annotating the interface, otherwise it will
// hide the other restx.security.SecuritySettingsConfig classes
@Provides
public SecuritySettings securitySettings(final RestxConfig config) {
return new SecuritySettings() {
@Override
public int sessionsLimit() {
return config.getInt("restx.sessions.stats.limit").or(100);
}
};
}
@Provides @Named(ENTRY_CACHE_MANAGER)
public EntryCacheManager guavaCacheManager() {
return new GuavaEntryCacheManager();
}
@Provides(priority = 100000)
@When(name = "restx.mode", value = "prod")
public RestxRoute productionNotFoundHandler() {
return new RestxRoute() {
@Override
public Optional match(RestxRequest req) {
return Optional.of(new RestxHandlerMatch(
new StdRestxRequestMatch("*", req.getRestxPath()),
new RestxHandler() {
@Override
public void handle(RestxRequestMatch match, RestxRequest req, RestxResponse resp, RestxContext ctx) throws IOException {
throw new WebException(HttpStatus.NOT_FOUND);
}
}
));
}
};
}
}