Широ использует собственный фильтр для сообщения об ошибке «Для вызывающего кода недоступен SecurityManager».JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Широ использует собственный фильтр для сообщения об ошибке «Для вызывающего кода недоступен SecurityManager».

Сообщение 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






Подробнее здесь: https://stackoverflow.com/questions/783 ... essible-to
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»