Map<String, Filter> filters = new HashMap<>(); Filter是shiro AuthenticatingFilter 应该导入哪个filter包
时间: 2023-06-27 12:07:55 浏览: 82
如果你想导入shiro的`AuthenticatingFilter`,需要导入以下包:
```java
import org.apache.shiro.web.filter.authc.AuthenticatingFilter;
```
记得在你的项目中添加shiro-web依赖,因为`AuthenticatingFilter`是shiro-web的一部分。如果你使用Maven构建项目,可以在pom.xml文件中添加以下依赖:
```xml
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>1.7.1</version>
</dependency>
```
相关问题
@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; }
这是一个使用 Spring 和 Shiro 框架实现的安全认证过滤器配置。该代码片段中,首先创建了一个 ShiroFilterFactoryBean 实例,并将安全管理器注入该实例中。然后,创建了一个名为 oauth2 的过滤器,并将其加入到 filters 集合中。接着,创建了一个有序的、基于 URL 模式的过滤器链,并将该链设置到 ShiroFilterFactoryBean 实例中,其中 "/sys/login" 路径被设置为匿名访问,而 "/sys/**"、"/manage/**" 路径需要进行 oauth2 认证。最后,将 ShiroFilterFactoryBean 实例返回。
在 Spring Boot 中使用 shiro 配置自定义过滤器 UserAuthenticatingFilter extends AuthenticatingFilter以及 UserAuthenticatingOrJwtTokenFilter extends UserAuthenticatingFilter
在Spring Boot中使用Shiro进行自定义过滤器的配置,可以按照以下步骤进行操作:
1. 在pom.xml文件中添加Shiro的依赖:
```
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.7.1</version>
</dependency>
```
2. 创建自定义的过滤器类UserAuthenticatingFilter和UserAuthenticatingOrJwtTokenFilter,继承自Shiro提供的AuthenticatingFilter类。
UserAuthenticatingFilter类用于实现基于表单认证的过滤器,该过滤器可以在用户访问需要身份认证的资源时进行身份认证,并将用户的登录信息保存到Shiro的Subject对象中。
UserAuthenticatingOrJwtTokenFilter类用于实现基于JWT令牌认证的过滤器,该过滤器可以在用户访问需要身份认证的资源时进行身份认证,如果请求头中携带了有效的JWT令牌,则使用JWT令牌进行身份认证,否则使用基于表单的身份认证方式。
3. 在Shiro配置类中进行过滤器的配置:
```
@Configuration
public class ShiroConfig {
// ...
@Bean
public UserAuthenticatingFilter userAuthenticatingFilter() {
return new UserAuthenticatingFilter();
}
@Bean
public UserAuthenticatingOrJwtTokenFilter userAuthenticatingOrJwtTokenFilter() {
return new UserAuthenticatingOrJwtTokenFilter();
}
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager,
UserAuthenticatingFilter userAuthenticatingFilter,
UserAuthenticatingOrJwtTokenFilter userAuthenticatingOrJwtTokenFilter) {
// 创建ShiroFilterFactoryBean对象
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
// 设置SecurityManager
factoryBean.setSecurityManager(securityManager);
// 设置自定义过滤器
Map<String, Filter> filters = new HashMap<>();
filters.put("userAuthenticatingFilter", userAuthenticatingFilter);
filters.put("userAuthenticatingOrJwtTokenFilter", userAuthenticatingOrJwtTokenFilter);
factoryBean.setFilters(filters);
// 设置过滤器链
Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
filterChainDefinitionMap.put("/login", "anon");
filterChainDefinitionMap.put("/logout", "logout");
filterChainDefinitionMap.put("/**", "userAuthenticatingOrJwtTokenFilter");
factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
return factoryBean;
}
// ...
}
```
在上述代码中,我们通过@Bean注解创建了两个自定义的过滤器实例:UserAuthenticatingFilter和UserAuthenticatingOrJwtTokenFilter,然后将这两个过滤器添加到ShiroFilterFactoryBean对象中,并设置过滤器链。
4. 在Controller中使用Shiro进行身份认证:
```
@RestController
public class UserController {
@RequestMapping(value = "/login", method = RequestMethod.POST)
public String login(String username, String password) {
Subject subject = SecurityUtils.getSubject();
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
subject.login(token);
return "login success";
} catch (AuthenticationException e) {
return "login failed";
}
}
@RequestMapping(value = "/logout")
public String logout() {
Subject subject = SecurityUtils.getSubject();
subject.logout();
return "logout success";
}
@RequestMapping(value = "/test")
public String test() {
return "test success";
}
}
```
在上述代码中,我们通过调用SecurityUtils.getSubject()获取当前Subject对象,然后使用UsernamePasswordToken进行身份认证。如果身份认证成功,则返回"login success"字符串;否则返回"login failed"字符串。
5. 在Postman或浏览器中访问API:
- 访问/login接口进行身份认证,例如:
```
POST http://localhost:8080/login?username=admin&password=admin
```
- 访问/test接口进行访问控制,例如:
```
GET http://localhost:8080/test
```
如果用户已经登录,则返回"test success"字符串;否则返回"401 Unauthorized"错误。
阅读全文