在 Spring Boot 中使用 shiro 配置自定义过滤器 UserAuthenticatingFilter extends AuthenticatingFilter以及 UserAuthenticatingOrJwtTokenFilter extends UserAuthenticatingFilter
时间: 2023-06-27 13:08:04 浏览: 137
在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"错误。
阅读全文