Изначально мой 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
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как зарегистрировать вызывающего метода вместо метода, вызывающего Logger
Anonymous » » в форуме JAVA - 0 Ответы
- 35 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Каковы альтернативы SecurityManager для изолирования ненадежного кода в Java?
Anonymous » » в форуме JAVA - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Каковы альтернативы SecurityManager для нерешенного кода с песочницей в Java?
Anonymous » » в форуме JAVA - 0 Ответы
- 5 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Каковы альтернативы SecurityManager для нерешенного кода с песочницей в Java?
Anonymous » » в форуме JAVA - 0 Ответы
- 4 Просмотры
-
Последнее сообщение Anonymous
-