Hello all,
I try to configure Shiro web + Spring + my custrom Realm but I have a problem.
This is my web initializer:
@Order(Ordered.HIGHEST_PRECEDENCE)
public class WebInitializer implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws
ServletException {
var diContext = new AnnotationConfigWebApplicationContext();
diContext.register(TempConfig.class);
diContext.setServletContext(servletContext);
var servlet = servletContext.addServlet("SpringServlet", new
DispatcherServlet(diContext));
servlet.setLoadOnStartup(1);
servlet.addMapping("/");
FilterRegistration.Dynamic filterRegistration =
servletContext.addFilter("ShiroFilter",
"org.apache.shiro.web.servlet.ShiroFilter");
filterRegistration.addMappingForUrlPatterns(
EnumSet.<DispatcherType> of(
DispatcherType.REQUEST,
DispatcherType.FORWARD,
DispatcherType.INCLUDE,
DispatcherType.ERROR
),
false, "/*");
servletContext.addListener("org.apache.shiro.web.env.EnvironmentLoaderListener");
}
}
This is Spring config:
@Configuration
@ComponentScan(basePackageClasses = {
MyController.class,
})
@EnableWebMvc
@Import ({
ShiroBeanConfiguration.class,
ShiroAnnotationProcessorConfiguration.class,
ShiroWebConfiguration.class,
ShiroWebFilterConfiguration.class,
ShiroRequestMappingConfig.class
})
public class TempConfig implements WebMvcConfigurer {
public TempConfig() {
}
@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public CacheManager cacheManager() {
var manager = new MemoryConstrainedCacheManager();
return manager;
}
@Bean
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public Realm realm() {
var realm = new SecurityRealm();// <- this is my custom realm.
return realm;
}
}
And this is what I get:
WARN org.apache.shiro.authc.AbstractAuthenticator - Authentication failed for
token submission [temp.security.WebAuthenticationToken@79ffcf2c]. Possible
unexpected error? (Typical or expected login exceptions should extend from
AuthenticationException).
java.lang.IllegalStateException: Configuration error: No realms have been
configured! One or more realms must be present to execute an authentication
attempt.
at
org.apache.shiro.authc.pam.ModularRealmAuthenticator.assertRealmsConfigured(ModularRealmAuthenticator.java:161)
~[shiro-all-1.7.0.jar:?]
at
org.apache.shiro.authc.pam.ModularRealmAuthenticator.doAuthenticate(ModularRealmAuthenticator.java:270)
~[shiro-all-1.7.0.jar:?]
at
org.apache.shiro.authc.AbstractAuthenticator.authenticate(AbstractAuthenticator.java:198)
[shiro-all-1.7.0.jar:?]
at
org.apache.shiro.mgt.AuthenticatingSecurityManager.authenticate(AuthenticatingSecurityManager.java:106)
[shiro-all-1.7.0.jar:?]
at
org.apache.shiro.mgt.DefaultSecurityManager.login(DefaultSecurityManager.java:275)
[shiro-all-1.7.0.jar:?]
at
org.apache.shiro.subject.support.DelegatingSubject.login(DelegatingSubject.java:260)
[shiro-all-1.7.0.jar:?]
At the same time, I see in log, that my realm#onInit method was called and the
realm was intialized. However, Shiro doesn’t see it. I use jetty 9 + spring 5.
I do NOT use spring boot. Could anyone say, how to fix it?
--
Best regards, Alex Orlov