引言
Shiro 是一个强大的Java安全框架,它提供了易于使用的API来处理身份验证、授权和会话管理。Spring Boot 作为Java开发的轻量级框架,与Shiro的结合使得安全配置变得更加简单。本文将带你从入门到精通,轻松掌握Boot集成Shiro的实战攻略。
一、Shiro简介
1.1 Shiro的核心组件
Shiro框架主要由以下核心组件构成:
- Subject:当前登录的用户。
- SecurityManager:Shiro的核心,负责管理内部组件的交互。
- Realm:负责认证和授权。
- SessionManager:负责会话管理。
- CacheManager:负责缓存管理。
1.2 Shiro的工作流程
Shiro的工作流程可以概括为以下几个步骤:
- 用户提交用户名和密码。
- Realm获取AuthenticationInfo。
- SecurityManager进行认证。
- Subject进行授权。
二、Boot集成Shiro
2.1 添加依赖
在Spring Boot项目中,首先需要在pom.xml文件中添加Shiro的依赖:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.8.0</version>
</dependency>
2.2 配置Shiro
在application.properties或application.yml文件中配置Shiro:
shiro.cacheManager=org.apache.shiro.cache.ehcache.EhCacheManager
shiro.sessionManager=org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionManager
shiro.sessionManager.sessionValidationInterval=1800
shiro.sessionManager.globalSessionTimeout=3600
2.3 编写Shiro配置类
创建一个Shiro配置类,用于配置Shiro的各个组件:
@Configuration
public class ShiroConfig extends WebSecurityConfigurerAdapter {
@Bean
public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
shiroFilterFactoryBean.setSecurityManager(securityManager);
// 配置过滤规则
// ...
return shiroFilterFactoryBean;
}
@Bean
public SecurityManager securityManager() {
DefaultSecurityManager securityManager = new DefaultSecurityManager();
// 设置Realm
securityManager.setRealm(myRealm());
return securityManager;
}
@Bean
public AuthorizingRealm myRealm() {
return new MyRealm();
}
}
2.4 编写Realm
创建一个自定义的Realm类,用于处理认证和授权:
public class MyRealm extends AuthorizingRealm {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 根据用户名查询用户信息
// ...
return new SimpleAuthenticationInfo(user, user.getPassword(), getName());
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 根据用户信息查询权限信息
// ...
return new SimpleAuthorizationInfo(new HashSet<>(user.getPermissions()));
}
}
2.5 编写Controller
在Controller中,使用@PreAuthorize注解进行权限控制:
@RestController
@RequestMapping("/user")
public class UserController {
@PreAuthorize("hasAuthority('user:edit')")
@GetMapping("/edit/{id}")
public String edit(@PathVariable Long id) {
// ...
}
}
三、实战案例
以下是一个简单的用户登录示例:
@RestController
@RequestMapping("/login")
public class LoginController {
@PostMapping
public String login(@RequestParam String username, @RequestParam String password) {
// 获取Subject
Subject subject = SecurityUtils.getSubject();
// 创建用户名密码Token
UsernamePasswordToken token = new UsernamePasswordToken(username, password);
try {
// 进行认证
subject.login(token);
return "登录成功";
} catch (AuthenticationException e) {
return "登录失败:" + e.getMessage();
}
}
}
四、总结
通过本文的介绍,相信你已经对Boot集成Shiro有了深入的了解。在实际项目中,可以根据需求进行扩展和定制。希望本文能帮助你轻松掌握Boot集成Shiro的实战攻略。