Как настроить shiro.ini для пользовательской области в приложении spring-boot?

У меня есть свой Пользовательский мир

public class MyCustomRealm extends JdbcRealm  {
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) {
        // Custom code
    }
}

файл shiro.ini следующим образом:

jdbcRealm= com.company.security.shiro.realm.MyCustomRealm 
jdbcRealm.permissionsLookupEnabled = true
ds = com.mysql.jdbc.jdbc2.optional.MysqlDataSource
ds.serverName = jdbc:mysql://datasource
ds.user = user
ds.password = pass
jdbcRealm.dataSource=$ds
securityManager.realms = $jdbcRealm

Кто-нибудь знает, что нужно сделать, чтобы настроить/зарегистрировать shiro.ini для проекта spring-boot? или какая конфигурация требуется в файле SpringBootApp.java?

@Bean
public Realm realm() {
    Realm realm  = new IniRealm("classpath:shiro.ini");
    DefaultSecurityManager securityManager = new DefaultSecurityManager(realm);
    SecurityUtils.setSecurityManager(securityManager);
    return realm;
}

Использование вышеуказанного bean-компонента приводит к следующему исключению:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shiroEventBusAwareBeanPostProcessor' defined in class path resource [org/apache/shiro/spring/boot/autoconfigure/ShiroBeanAutoConfiguration.class]: BeanPostProcessor before instantiation of bean failed; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'authorizationAttributeSourceAdvisor' defined in class path resource [org/apache/shiro/spring/boot/autoconfigure/ShiroAnnotationProcessorAutoConfiguration.class]: Unsatisfied dependency expressed through method 'authorizationAttributeSourceAdvisor' parameter 0; nested exception is org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'securityManager' defined in class path resource [org/apache/shiro/spring/config/web/autoconfigure/ShiroWebAutoConfiguration.class]: Unsatisfied dependency expressed through method 'securityManager' parameter 0; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'iniClasspathRealm' defined in class path resource [org/apache/shiro/spring/boot/autoconfigure/ShiroAutoConfiguration.class]: Initialization of bean failed; nested exception is org.springframework.beans.FatalBeanException: Error initializing bean [iniClasspathRealm]; nested exception is java.lang.IllegalStateException: Ini instance and/or resourcePath resulted in null or empty Ini configuration.  Cannot load account data.
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:490) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:204) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]


Caused by: java.lang.IllegalStateException: Ini instance and/or resourcePath resulted in null or empty Ini configuration.  Cannot load account data.
    at org.apache.shiro.realm.text.IniRealm.onInit(IniRealm.java:165) ~[shiro-core-1.4.0.jar:1.4.0]
    at org.apache.shiro.realm.AuthenticatingRealm.init(AuthenticatingRealm.java:398) ~[shiro-core-1.4.0.jar:1.4.0]
    at org.apache.shiro.spring.LifecycleBeanPostProcessor.postProcessBeforeInitialization(LifecycleBeanPostProcessor.java:89) ~[shiro-spring-1.4.0.jar:1.4.0]
    ... 66 common frames omitted

Я предполагаю, что ваш файл shiro.ini НЕ находится в вашем пути к классам.

Brian Demers 26.02.2019 17:15

Спасибо, Брайан, у меня есть файл shiro.ini по пути src/main/resources.

Amey S 26.02.2019 17:17

Это доходит до вашего пути к классам? Можете ли вы поставить точку останова на org.apache.shiro.realm.text.IniRealm.onInit(IniRealm.java:16‌​5) и покопаться в своем cp?

Brian Demers 27.02.2019 18:31

Привет, Брайан, извини за поздний ответ. В ответ на ваше предложение отлаживать IniRealm я полностью удалил файл ini из своего пути к классам, поскольку использую весеннюю загрузку, поэтому использую Bean для настройки области. Я заметил, что если нам действительно не нужен ini-файл, то лучше удалить его из пути к классам, чем просто комментировать конфигурацию ini. В этом случае закомментированная конфигурация в ini-файле создает исключение Ini instance и/или resourcePath приводит к нулевой или пустой конфигурации Ini.

Amey S 25.03.2019 15:57
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
4
1 361
1

Ответы 1

This is how I made it work, Please suggest if any other better way of doing it.

-Removed existing Bean realm().
-Added authorizer bean to SprinBootApp main class

    @Bean
        public Authorizer authorizer() {
            MyCusotmRealm realm = new MyCusotmRealm();
            return realm;
        }

- Added shiro filter chain definition(seems crucial).  


     @Bean
       public ShiroFilterChainDefinition shiroFilterChainDefinition() {
       DefaultShiroFilterChainDefinition chainDefinition = new 
                DefaultShiroFilterChainDefinition();
                chainDefinition.addPathDefinition("/**", "anon");
                return chainDefinition;
            }

 - Removed datasource ds from shiro.ini, as I am leveraging database connection through spring boot application.properties file.
   shiro.ini will look like:    

   jdbcRealm= com.company.security.shiro.realm.MyCustomRealm 
   securityManager.realms = $jdbcRealm

Другие вопросы по теме