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