Изначально мой filterChainDefinitionMap был filterChainDefinitionMap.put("/login/**","anon"); он нормально реагировал при вызове интерфейса, но теперь у меня возникла необходимость. Все "/login/**" необходимо записать после успешного входа в систему. Немного информации, поэтому я настроил CustomLoginFilter и унаследовал его от BasicHttpAuthenticationFilter, переопределив метод onLoginSuccess. Затем измените filterChainDefinitionMap на filterChainDefinitionMap.put("/login/**", "customLoginFilter"); В этот момент обнаруживается, что возвращаемое значение вызова интерфейса равно {"timestamp":1713163170942,"status ":500,"error":"Внутренняя ошибка сервера","path":"/login/local".Проверив консоль, я обнаружил, что сообщение об ошибке было org.apache.shiro.UnavailableSecurityManagerException: Нет SecurityManager, доступного для вызывающего кода, либо привязанного к org.apache.shiro.util.ThreadContext, либо как статический синглтон виртуальной машины. Это неверная конфигурация приложения.
Я не знаю, неверна ли моя конфигурация Широ. Я проверил информацию в Интернете, и один из методов — вручную привязать SecurityManage к текущему потоку, а именно ThreadContext.bind(securityManager);В этот раз я обнаружил, что код состояния HTTP вызова интерфейса Ответ изменился на 401, и на консоли не было создано никаких журналов.
Ниже приведен мой класс конфигурации shiro.
@Slf4j
@Configuration
public class ShiroConfig {
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.redis.port}")
private int port;
@Value("${redis.biz_cache_time.session}")
private Long sessionExpireTime;
@Autowired
private RedisTemplate redisShiroTemplate;
@Bean
public ShiroFilterFactoryBean getShiroFilterBean(DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(defaultWebSecurityManager);
LinkedHashMap filterMap = new LinkedHashMap();
filterMap.put("customLoginFilter",new CustomLoginFilter());
bean.setFilters(filterMap);
Map filterChainDefinitionMap = new LinkedHashMap();
filterChainDefinitionMap.put("/login/**", "customLoginFilter");
bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
bean.setLoginUrl("/login/to-login");
return bean;
}
@Bean(name="securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(AbstractAuthenticator abstractAuthenticator){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setSessionManager(sessionManager());
securityManager.setAuthenticator(abstractAuthenticator);
return securityManager;
}
@Bean("lifecycleBeanPostProcessor")
public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean
public AbstractAuthenticator abstractAuthenticator() {
ModularRealmAuthenticator authenticator = new MyCustomModularRealmAuthenticator();
authenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());
List realms = new ArrayList();
realms.add(customRealm());
authenticator.setRealms(realms);
return authenticator;
}
@Bean
public DefaultWebSessionManager sessionManager() {
StatelessSessionManager sessionManager = new StatelessSessionManager();
sessionManager.setSessionIdCookie(cookie());
sessionManager.setGlobalSessionTimeout(sessionExpireTime);
sessionManager.setSessionDAO(redisSessionDAO());
sessionManager.setDeleteInvalidSessions(true);
return sessionManager;
}
@Bean
public CustomRealm customRealm() {
return new CustomRealm();
}
@Bean
public SimpleCookie cookie() {
SimpleCookie cookie = new SimpleCookie("Authorization");
cookie.setPath("/");
return cookie;
}
@Bean
SessionDAO redisSessionDAO() {
return new RedisSessionDAO(MagicValueConst.SHIRO_REDIS_PREFIX, sessionExpireTime, redisShiroTemplate);
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager){
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
@Bean
public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
return defaultAdvisorAutoProxyCreator;
}
}
Моя конфигурация maven следующая:
...
org.springframework.boot
spring-boot-starter-parent
3.1.5
...
17
...
org.apache.shiro
shiro-spring-boot-web-starter
1.13.0
org.apache.shiro
shiro-spring
org.apache.shiro
shiro-spring
jakarta
1.13.0
org.apache.shiro
shiro-core
org.apache.shiro
shiro-web
org.apache.shiro
shiro-core
jakarta
1.13.0
org.apache.shiro
shiro-web
jakarta
1.13.0
org.apache.shiro
shiro-core
Подробнее здесь: https://stackoverflow.com/questions/783 ... essible-to
Широ использует собственный фильтр для сообщения об ошибке «Для вызывающего кода недоступен SecurityManager». ⇐ JAVA
Программисты JAVA общаются здесь
1713239534
Anonymous
Изначально мой filterChainDefinitionMap был filterChainDefinitionMap.put("/login/**","anon"); он нормально реагировал при вызове интерфейса, но теперь у меня возникла необходимость. Все "/login/**" необходимо записать после успешного входа в систему. Немного информации, поэтому я настроил CustomLoginFilter и унаследовал его от BasicHttpAuthenticationFilter, переопределив метод onLoginSuccess. Затем измените filterChainDefinitionMap на filterChainDefinitionMap.put("/login/**", "customLoginFilter"); В этот момент обнаруживается, что возвращаемое значение вызова интерфейса равно {"timestamp":1713163170942,"status ":500,"error":"Внутренняя ошибка сервера","path":"/login/local".Проверив консоль, я обнаружил, что сообщение об ошибке было org.apache.shiro.UnavailableSecurityManagerException: Нет SecurityManager, доступного для вызывающего кода, либо привязанного к org.apache.shiro.util.ThreadContext, либо как статический синглтон виртуальной машины. Это неверная конфигурация приложения.
Я не знаю, неверна ли моя конфигурация Широ. Я проверил информацию в Интернете, и один из методов — вручную привязать SecurityManage к текущему потоку, а именно ThreadContext.bind(securityManager);В этот раз я обнаружил, что код состояния HTTP вызова интерфейса Ответ изменился на 401, и на консоли не было создано никаких журналов.
Ниже приведен мой класс конфигурации shiro.
@Slf4j
@Configuration
public class ShiroConfig {
@Value("${spring.data.redis.host}")
private String host;
@Value("${spring.data.redis.port}")
private int port;
@Value("${redis.biz_cache_time.session}")
private Long sessionExpireTime;
@Autowired
private RedisTemplate redisShiroTemplate;
@Bean
public ShiroFilterFactoryBean getShiroFilterBean(DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
bean.setSecurityManager(defaultWebSecurityManager);
LinkedHashMap filterMap = new LinkedHashMap();
filterMap.put("customLoginFilter",new CustomLoginFilter());
bean.setFilters(filterMap);
Map filterChainDefinitionMap = new LinkedHashMap();
filterChainDefinitionMap.put("/login/**", "customLoginFilter");
bean.setFilterChainDefinitionMap(filterChainDefinitionMap);
bean.setLoginUrl("/login/to-login");
return bean;
}
@Bean(name="securityManager")
public DefaultWebSecurityManager getDefaultWebSecurityManager(AbstractAuthenticator abstractAuthenticator){
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
securityManager.setSessionManager(sessionManager());
securityManager.setAuthenticator(abstractAuthenticator);
return securityManager;
}
@Bean("lifecycleBeanPostProcessor")
public static LifecycleBeanPostProcessor lifecycleBeanPostProcessor() {
return new LifecycleBeanPostProcessor();
}
@Bean
public AbstractAuthenticator abstractAuthenticator() {
ModularRealmAuthenticator authenticator = new MyCustomModularRealmAuthenticator();
authenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());
List realms = new ArrayList();
realms.add(customRealm());
authenticator.setRealms(realms);
return authenticator;
}
@Bean
public DefaultWebSessionManager sessionManager() {
StatelessSessionManager sessionManager = new StatelessSessionManager();
sessionManager.setSessionIdCookie(cookie());
sessionManager.setGlobalSessionTimeout(sessionExpireTime);
sessionManager.setSessionDAO(redisSessionDAO());
sessionManager.setDeleteInvalidSessions(true);
return sessionManager;
}
@Bean
public CustomRealm customRealm() {
return new CustomRealm();
}
@Bean
public SimpleCookie cookie() {
SimpleCookie cookie = new SimpleCookie("Authorization");
cookie.setPath("/");
return cookie;
}
@Bean
SessionDAO redisSessionDAO() {
return new RedisSessionDAO(MagicValueConst.SHIRO_REDIS_PREFIX, sessionExpireTime, redisShiroTemplate);
}
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(DefaultWebSecurityManager securityManager){
AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
return authorizationAttributeSourceAdvisor;
}
@Bean
public static DefaultAdvisorAutoProxyCreator getDefaultAdvisorAutoProxyCreator(){
DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator = new DefaultAdvisorAutoProxyCreator();
defaultAdvisorAutoProxyCreator.setProxyTargetClass(true);
return defaultAdvisorAutoProxyCreator;
}
}
Моя конфигурация maven следующая:
...
org.springframework.boot
spring-boot-starter-parent
3.1.5
...
17
...
org.apache.shiro
shiro-spring-boot-web-starter
1.13.0
org.apache.shiro
shiro-spring
org.apache.shiro
shiro-spring
jakarta
1.13.0
org.apache.shiro
shiro-core
org.apache.shiro
shiro-web
org.apache.shiro
shiro-core
jakarta
1.13.0
org.apache.shiro
shiro-web
jakarta
1.13.0
org.apache.shiro
shiro-core
Подробнее здесь: [url]https://stackoverflow.com/questions/78326613/shiro-uses-a-custom-filter-to-report-an-error-no-securitymanager-accessible-to[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия