package gov.nysenate.openleg.config;
import gov.nysenate.openleg.service.shiro.shiroCacheManager;
import org.apache.shiro.cache.CacheManager;
import org.apache.shiro.cache.MemoryConstrainedCacheManager;
import org.apache.shiro.config.Ini;
import org.apache.shiro.realm.Realm;
import org.apache.shiro.spring.LifecycleBeanPostProcessor;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import javax.annotation.PostConstruct;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
@Configuration
public class SecurityConfig
{
private static final Logger logger = LoggerFactory.getLogger(SecurityConfig.class);
@Autowired protected List<Realm> realms;
/**
* Shiro Filter factory that sets up the url authentication mechanism and applies the security
* manager instance.
*/
@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean shiroFilter() {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager());
shiroFilter.setFilterChainDefinitionMap(shiroIniConfig().getSection("urls"));
return shiroFilter;
}
/**
* Integrates Apache Shiro with Spring
* @return LifecycleBeanPostProcessor
*/
@Bean
public LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
/**
* This is needed for Shiro annotations to work.
* @return DefaultAdvisorAutoProxyCreator
*/
@Bean
@DependsOn("lifecycleBeanPostProcessor")
public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
return new DefaultAdvisorAutoProxyCreator();
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor() {
AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager());
return advisor;
}
/**
* Configures the shiroCacheService security manager with the instance of the active realm.
*/
@Bean(name = "securityManager")
public DefaultWebSecurityManager securityManager() {
DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
defaultWebSecurityManager.setCacheManager(shiroCacheManager());
return defaultWebSecurityManager;
}
@Bean(name = "shiroCacheManager")
public CacheManager shiroCacheManager() {
return new shiroCacheManager();
}
/**
* Exposes the shiroCacheService.ini configuration file as an Ini instance that is consumed by the
* security filter manager when setting up the filter chains.
*/
public Ini shiroIniConfig() {
return Ini.fromResourcePath("classpath:shiro.ini");
}
}