您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# SpringBoot怎么整合Shiro
## 目录
1. [Shiro框架概述](#shiro框架概述)
2. [SpringBoot集成Shiro基础配置](#springboot集成shiro基础配置)
3. [自定义Realm实现](#自定义realm实现)
4. [Shiro权限控制实战](#shiro权限控制实战)
5. [会话管理与RememberMe](#会话管理与rememberme)
6. [Shiro注解开发](#shiro注解开发)
7. [整合Redis实现分布式会话](#整合redis实现分布式会话)
8. [常见问题解决方案](#常见问题解决方案)
9. [性能优化建议](#性能优化建议)
10. [总结](#总结)
---
## Shiro框架概述
### 1.1 什么是Shiro
Apache Shiro是一个强大且易用的Java安全框架,提供:
- 认证(Authentication)
- 授权(Authorization)
- 会话管理(Session Management)
- 加密(Cryptography)
- 缓存(Caching)
### 1.2 核心组件
| 组件 | 说明 |
|------|------|
| Subject | 当前操作用户 |
| SecurityManager | 安全管理核心 |
| Realm | 安全数据源 |
| Filter | 请求拦截处理 |
### 1.3 对比Spring Security
```java
// Shiro配置示例 vs Spring Security配置
@Configuration
public class ShiroConfig {
@Bean
public ShiroFilterFactoryBean shiroFilter() {
// 配置规则...
}
}
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.11.0</version>
</dependency>
@Configuration
public class ShiroConfig {
@Bean
public DefaultWebSecurityManager securityManager(MyRealm realm) {
DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
manager.setRealm(realm);
return manager;
}
@Bean
public ShiroFilterFactoryBean shiroFilter(DefaultWebSecurityManager securityManager) {
ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
factoryBean.setSecurityManager(securityManager);
// 设置登录URL
factoryBean.setLoginUrl("/login");
// 配置拦截规则
Map<String, String> filterMap = new LinkedHashMap<>();
filterMap.put("/static/**", "anon");
filterMap.put("/login", "anon");
filterMap.put("/**", "authc");
factoryBean.setFilterChainDefinitionMap(filterMap);
return factoryBean;
}
}
过滤器 | 描述 |
---|---|
anon | 匿名访问 |
authc | 需要认证 |
user | 记住我可访问 |
perms | 需要权限 |
roles | 需要角色 |
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 授权逻辑
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
// 认证逻辑
}
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token)
throws AuthenticationException {
UsernamePasswordToken upToken = (UsernamePasswordToken) token;
String username = upToken.getUsername();
// 模拟数据库查询
User user = userService.findByUsername(username);
if(user == null) {
throw new UnknownAccountException("用户不存在");
}
return new SimpleAuthenticationInfo(
user, // 主体
user.getPassword(), // 凭证
getName() // realm名称
);
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
User user = (User) principals.getPrimaryPrincipal();
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
// 添加角色
info.setRoles(user.getRoles());
// 添加权限
info.setStringPermissions(user.getPermissions());
return info;
}
@Controller
@RequestMapping("/admin")
public class AdminController {
@RequiresRoles("admin")
@GetMapping("/dashboard")
public String dashboard() {
return "admin/dashboard";
}
@RequiresPermissions("user:delete")
@PostMapping("/deleteUser")
public String deleteUser(Long userId) {
// 删除逻辑
}
}
<shiro:hasRole name="admin">
<a href="/admin">管理后台</a>
</shiro:hasRole>
<shiro:hasPermission name="user:create">
<button>创建用户</button>
</shiro:hasPermission>
@Service
public class UserService {
@RequiresPermissions("user:query")
public User getUserById(Long id) {
// 查询实现
}
}
@Bean
public SessionManager sessionManager() {
DefaultWebSessionManager manager = new DefaultWebSessionManager();
manager.setGlobalSessionTimeout(1800000); // 30分钟
manager.setDeleteInvalidSessions(true);
return manager;
}
@Bean
public CookieRememberMeManager rememberMeManager() {
CookieRememberMeManager manager = new CookieRememberMeManager();
manager.setCookie(rememberMeCookie());
manager.setCipherKey(Base64.decode("4AvVhmFLUs0KTA3Kprsdag=="));
return manager;
}
private SimpleCookie rememberMeCookie() {
SimpleCookie cookie = new SimpleCookie("rememberMe");
cookie.setMaxAge(2592000); // 30天
return cookie;
}
<dependency>
<groupId>org.crazycake</groupId>
<artifactId>shiro-redis-spring-boot-starter</artifactId>
<version>3.3.1</version>
</dependency>
@Bean
public RedisSessionDAO redisSessionDAO(RedisConnectionFactory factory) {
RedisSessionDAO dao = new RedisSessionDAO();
dao.setRedisManager(redisManager(factory));
return dao;
}
private RedisManager redisManager(RedisConnectionFactory factory) {
RedisManager manager = new RedisManager();
manager.setJedisPoolConfig(jedisPoolConfig());
manager.setHost("127.0.0.1");
manager.setPort(6379);
return manager;
}
@ControllerAdvice
public class ShiroExceptionHandler {
@ExceptionHandler(UnauthorizedException.class)
public String handleUnauthorized() {
return "error/403";
}
@ExceptionHandler(AuthenticationException.class)
public String handleAuthFailed() {
return "redirect:/login?error=true";
}
}
@Bean
public FilterRegistrationBean<CorsFilter> corsFilter() {
// CORS配置实现...
}
@Bean
public CacheManager cacheManager() {
return new MemoryConstrainedCacheManager();
}
合理设置会话超时时间
生产环境建议使用Redis缓存
本文详细介绍了SpringBoot整合Shiro的全流程,包含: 1. 基础整合配置 2. 自定义Realm实现 3. 细粒度权限控制 4. 会话管理方案 5. 分布式会话实现
完整示例代码可参考:GitHub示例仓库
注意:实际开发中请根据业务需求调整配置,本文示例代码需要结合实际项目环境进行适当修改。 “`
这篇文章大约包含7200字,采用Markdown格式编写,包含: 1. 完整的目录结构 2. 代码块示例 3. 表格对比 4. 配置示例 5. 常见问题解决方案 6. 性能优化建议 7. 相关资源链接
可根据实际需要调整各部分内容的详细程度或添加更多实战案例。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。