SHIRO-618 - Autoconfiguration for Realm and ShiroFilterChainDefinition
diff --git a/support/spring-boot/spring-boot-web-starter/src/main/java/org/apache/shiro/spring/config/web/autoconfigure/ShiroNoRealmConfiguredFailureAnalyzer.java b/support/spring-boot/spring-boot-web-starter/src/main/java/org/apache/shiro/spring/config/web/autoconfigure/ShiroNoRealmConfiguredFailureAnalyzer.java
new file mode 100644
index 0000000..9a3f3c5
--- /dev/null
+++ b/support/spring-boot/spring-boot-web-starter/src/main/java/org/apache/shiro/spring/config/web/autoconfigure/ShiroNoRealmConfiguredFailureAnalyzer.java
@@ -0,0 +1,14 @@
+package org.apache.shiro.spring.config.web.autoconfigure;

+

+import org.apache.shiro.spring.config.web.autoconfigure.exception.NoRealmBeanConfiguredException;

+import org.springframework.boot.diagnostics.AbstractFailureAnalyzer;

+import org.springframework.boot.diagnostics.FailureAnalysis;

+

+public class ShiroNoRealmConfiguredFailureAnalyzer extends AbstractFailureAnalyzer<NoRealmBeanConfiguredException> {

+ 

+ 	@Override

+ 	protected FailureAnalysis analyze(Throwable rootFailure, NoRealmBeanConfiguredException cause) {

+ 		return new FailureAnalysis( "No bean of type 'org.apache.shiro.realm.Realm' found.", "Please create bean of type realm or add a shiro.ini in the root classpath (src/main/resources/shiro.ini) or in the META-INF folder (src/main/resources/META-INF/shiro.ini) .", cause);

+ 	}

+ 

+ }
\ No newline at end of file
diff --git a/support/spring-boot/spring-boot-web-starter/src/main/java/org/apache/shiro/spring/config/web/autoconfigure/ShiroWebAutoConfiguration.java b/support/spring-boot/spring-boot-web-starter/src/main/java/org/apache/shiro/spring/config/web/autoconfigure/ShiroWebAutoConfiguration.java
index 953a63e..b458f67 100644
--- a/support/spring-boot/spring-boot-web-starter/src/main/java/org/apache/shiro/spring/config/web/autoconfigure/ShiroWebAutoConfiguration.java
+++ b/support/spring-boot/spring-boot-web-starter/src/main/java/org/apache/shiro/spring/config/web/autoconfigure/ShiroWebAutoConfiguration.java
@@ -18,24 +18,30 @@
  */
 package org.apache.shiro.spring.config.web.autoconfigure;
 
+import java.util.List;
+
 import org.apache.shiro.authc.Authenticator;
 import org.apache.shiro.authc.pam.AuthenticationStrategy;
 import org.apache.shiro.authz.Authorizer;
-import org.apache.shiro.mgt.*;
+import org.apache.shiro.config.Ini;
+import org.apache.shiro.mgt.RememberMeManager;
+import org.apache.shiro.mgt.SessionStorageEvaluator;
+import org.apache.shiro.mgt.SessionsSecurityManager;
+import org.apache.shiro.mgt.SubjectDAO;
+import org.apache.shiro.mgt.SubjectFactory;
 import org.apache.shiro.realm.Realm;
+import org.apache.shiro.realm.text.IniRealm;
 import org.apache.shiro.session.mgt.SessionFactory;
 import org.apache.shiro.session.mgt.SessionManager;
 import org.apache.shiro.session.mgt.eis.SessionDAO;
+import org.apache.shiro.spring.config.web.autoconfigure.exception.NoRealmBeanConfiguredException;
 import org.apache.shiro.spring.web.config.AbstractShiroWebConfiguration;
 import org.apache.shiro.web.servlet.Cookie;
-import org.springframework.boot.autoconfigure.AutoConfigureOrder;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
 import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnResource;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Import;
-
-import java.util.List;
 
 /**
  * @since 1.4.0
@@ -134,5 +140,27 @@
     protected SessionsSecurityManager securityManager(List<Realm> realms) {
         return super.securityManager(realms);
     }
+    
+    @Bean
+    @ConditionalOnResource(resources = "classpath:shiro.ini")
+    protected Realm iniClasspathRealm() {
+        Ini ini = Ini.fromResourcePath("classpath:shiro.ini");
+        IniRealm iniRealm = new IniRealm( ini );
+        return iniRealm;
+    }
+    
+    @Bean
+    @ConditionalOnResource(resources = "classpath:META-INF/shiro.ini")
+    protected Realm iniMetaInfClasspathRealm() {
+        Ini ini = Ini.fromResourcePath("classpath:META-INF/shiro.ini");
+        IniRealm iniRealm = new IniRealm( ini );
+        return iniRealm;
+    }
+    
+    @Bean
+    @ConditionalOnMissingBean(Realm.class)
+    protected Realm missingRealm() {
+        throw new NoRealmBeanConfiguredException();
+    }
 
 }
diff --git a/support/spring-boot/spring-boot-web-starter/src/main/java/org/apache/shiro/spring/config/web/autoconfigure/exception/NoRealmBeanConfiguredException.java b/support/spring-boot/spring-boot-web-starter/src/main/java/org/apache/shiro/spring/config/web/autoconfigure/exception/NoRealmBeanConfiguredException.java
new file mode 100644
index 0000000..29c7d07
--- /dev/null
+++ b/support/spring-boot/spring-boot-web-starter/src/main/java/org/apache/shiro/spring/config/web/autoconfigure/exception/NoRealmBeanConfiguredException.java
@@ -0,0 +1,9 @@
+package org.apache.shiro.spring.config.web.autoconfigure.exception;

+

+/**

+ * This exception should be thrown if not bean of type {@link Realm} found.

+ *

+ */

+public class NoRealmBeanConfiguredException extends RuntimeException {

+

+}

diff --git a/support/spring-boot/spring-boot-web-starter/src/main/resources/META-INF/spring.factories b/support/spring-boot/spring-boot-web-starter/src/main/resources/META-INF/spring.factories
index 397c6e4..f056770 100644
--- a/support/spring-boot/spring-boot-web-starter/src/main/resources/META-INF/spring.factories
+++ b/support/spring-boot/spring-boot-web-starter/src/main/resources/META-INF/spring.factories
@@ -1 +1,3 @@
 org.springframework.boot.autoconfigure.EnableAutoConfiguration = org.apache.shiro.spring.config.web.autoconfigure.ShiroBeanAutoConfiguration,org.apache.shiro.spring.config.web.autoconfigure.ShiroWebAutoConfiguration,org.apache.shiro.spring.config.web.autoconfigure.ShiroWebFilterConfiguration,org.apache.shiro.spring.config.web.autoconfigure.ShiroAnnotationProcessorAutoConfiguration
+
+org.springframework.boot.diagnostics.FailureAnalyzer=org.apache.shiro.spring.config.web.autoconfigure.ShiroNoRealmConfiguredFailureAnalyzer
\ No newline at end of file