@Bean("shiroFilter") public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean(); shiroFilter.setSecurityManager(securityManager); //oauth过滤 Map<String, Filter> filters = new HashMap<>(4); filters.put("oauth2", new OAuth2Filter()); shiroFilter.setFilters(filters); Map<String, String> filterMap = new LinkedHashMap<>(8); filterMap.put("/sys/login", "anon"); filterMap.put("/sys/**", "oauth2"); filterMap.put("/manage/**", "oauth2"); filterMap.put("/wx/**", "anon"); filterMap.put("/**", "anon"); shiroFilter.setFilterChainDefinitionMap(filterMap); return shiroFilter; }
时间: 2024-04-25 09:28:03 浏览: 18
这是一个使用 Spring 和 Shiro 框架实现的安全认证过滤器配置。该代码片段中,首先创建了一个 ShiroFilterFactoryBean 实例,并将安全管理器注入该实例中。然后,创建了一个名为 oauth2 的过滤器,并将其加入到 filters 集合中。接着,创建了一个有序的、基于 URL 模式的过滤器链,并将该链设置到 ShiroFilterFactoryBean 实例中,其中 "/sys/login" 路径被设置为匿名访问,而 "/sys/**"、"/manage/**" 路径需要进行 oauth2 认证。最后,将 ShiroFilterFactoryBean 实例返回。
相关问题
Error creating bean with name 'shiroFilter' defined
根据提供的引用内容,出现"Error creating bean with name 'shiroFilter' defined"的原因是在ShiroFilterFactoryBean中的@Bean注解中未设置名字。在这种情况下,可以通过在@Bean注解中设置名字来解决这个问题。具体的解决方法如下所示:
```java
@Bean(name = "shiroFilter")
public ShiroFilterFactoryBean getShiroFilterFactoryBean(@Qualifier("securityManager") DefaultWebSecurityManager defaultWebSecurityManager){
ShiroFilterFactoryBean bean = new ShiroFilterFactoryBean();
//设置安全管理器
bean.setSecurityManager(defaultWebSecurityManager);
return bean;
}
```
通过在@Bean注解中设置名字为"shiroFilter",可以解决"Error creating bean with name 'shiroFilter' defined"的问题。
springboot shiro的filter怎么关联relam的
在 Spring Boot 中,我们可以通过配置 ShiroFilterFactoryBean 对 Shiro 进行配置。在 ShiroFilterFactoryBean 中,我们可以将一个或多个 Filter 与一个或多个 URL 路径进行关联。在这些 Filter 实例化时,我们可以将它们关联到一个或多个对应的 Realm 实例。
在 Shiro 中,Filter 实现了不同的功能,例如身份验证、授权、会话管理等。而 Realm 则是连接 Shiro 和应用程序的桥梁,它实现了从数据库、LDAP 或其他数据源中获取用户信息和权限信息的逻辑。
下面是一个使用 Shiro 和 Spring Boot 的示例代码,演示了如何将自定义的 Realm 与 Filter 关联起来:
```java
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
shiroFilter.setSecurityManager(securityManager);
Map<String, Filter> filters = new LinkedHashMap<>();
// 将自定义的 Filter 注入到 Spring 容器中
filters.put("authc", new CustomAuthcFilter());
shiroFilter.setFilters(filters);
Map<String, String> filterChainDefinitions = new LinkedHashMap<>();
// 定义 URL 路径与 Filter 的关系
filterChainDefinitions.put("/login", "anon");
filterChainDefinitions.put("/logout", "logout");
filterChainDefinitions.put("/**", "authc");
shiroFilter.setFilterChainDefinitionMap(filterChainDefinitions);
return shiroFilter;
}
@Bean
public SecurityManager securityManager(Realm realm) {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 将自定义的 Realm 注入到 SecurityManager 中
securityManager.setRealm(realm);
return securityManager;
}
@Bean
public Realm realm() {
return new CustomRealm();
}
}
```
在上面的代码中,我们通过 shirFilter() 方法创建了一个 ShiroFilterFactoryBean 实例,并将其关联到 SecurityManager 中。我们还使用 filters.put() 方法将自定义的 Filter 实例(CustomAuthcFilter)注入到 Spring 容器中,并为其设置名称("authc")。然后,我们将 URL 路径与 Filter 的关系定义在 filterChainDefinitions 中,最后将 filterChainDefinitions 设置到 ShiroFilterFactoryBean 中。在 securityManager() 方法中,我们将自定义的 Realm(CustomRealm)注入到 SecurityManager 中。