在当今的软件开发中,权限管理是一个至关重要的环节。Spring Boot作为Java后端开发的一个流行框架,Shiro则是一个强大的安全框架,两者结合能够帮助我们轻松实现高效权限管理。本文将带你从零开始,逐步学会如何将Shiro集成到Spring Boot项目中。
一、Shiro简介
Shiro是一个开源的安全框架,用于简化Java应用中的身份验证、授权、会话和加密等安全操作。它提供了完整的Java安全解决方案,包括身份验证、授权、会话管理和加密等功能。
二、Spring Boot简介
Spring Boot是一个开源的Java-based框架,用于简化Spring应用的初始搭建以及开发过程。它使用“约定大于配置”的原则,减少了项目的配置工作,使得开发者可以更加关注业务逻辑的实现。
三、Shiro集成Spring Boot
1. 添加依赖
首先,我们需要在Spring Boot项目的pom.xml文件中添加Shiro的依赖。
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring-boot-starter</artifactId>
<version>1.7.1</version>
</dependency>
2. 配置Shiro
接下来,我们需要在application.properties或application.yml文件中配置Shiro的相关参数。
# Shiro配置
shiro.cacheManager=org.apache.shiro.cache.ehcache.EhCacheManager
shiro.sessionManager=org.apache.shiro.session.mgt.eis.EnterpriseCacheSessionManager
shiro.sessionIdCookie.name=shiroSessionId
shiro.sessionIdCookie.maxAge=-1
3. 创建Shiro配置类
创建一个Shiro配置类,用于配置Shiro的各个组件。
@Configuration
public class ShiroConfig {
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 设置Realm
securityManager.setRealm(userRealm());
// 设置缓存管理器
securityManager.setCacheManager(cacheManager());
// 设置会话管理器
securityManager.setSessionManager(sessionManager());
return securityManager;
}
@Bean
public UserRealm userRealm() {
return new UserRealm();
}
@Bean
public CacheManager cacheManager() {
EhCacheManager cacheManager = new EhCacheManager();
cacheManager.setCacheNames(Arrays.asList("shiroCache"));
return cacheManager;
}
@Bean
public SessionManager sessionManager() {
EnterpriseCacheSessionManager sessionManager = new EnterpriseCacheSessionManager();
return sessionManager;
}
}
4. 创建Realm类
创建一个继承自AuthorizingRealm的Realm类,用于处理用户认证和授权。
public class UserRealm extends AuthorizingRealm {
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
// 根据用户名查询用户信息
String username = (String) token.getPrincipal();
// 模拟从数据库获取用户信息
User user = userService.findUserByUsername(username);
if (user == null) {
throw new UnknownAccountException("用户不存在");
}
// 创建AuthenticationInfo对象
AuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(user, user.getPassword(), getName());
return authenticationInfo;
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 根据用户名获取用户权限
String username = (String) principals.getPrimaryPrincipal();
List<String> permissions = userService.findPermissionsByUsername(username);
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
authorizationInfo.addStringPermissions(permissions);
return authorizationInfo;
}
}
5. 创建Controller
创建一个Controller类,用于处理用户登录和权限校验。
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserRealm userRealm;
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody User user) {
// 创建UsernamePasswordToken
UsernamePasswordToken token = new UsernamePasswordToken(user.getUsername(), user.getPassword());
// 执行认证
try {
SecurityUtils.getSubject().login(token);
return ResponseEntity.ok("登录成功");
} catch (AuthenticationException e) {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("登录失败:" + e.getMessage());
}
}
@GetMapping("/checkPermission")
@PreAuthorize("hasPermission('/user/checkPermission', 'GET')")
public ResponseEntity<?> checkPermission() {
return ResponseEntity.ok("有权限访问");
}
}
6. 启用Shiro
最后,在Spring Boot的主类上添加`@EnableShiro注解,启用Shiro框架。
@SpringBootApplication
@EnableShiro
public class ShiroApplication {
public static void main(String[] args) {
SpringApplication.run(ShiroApplication.class, args);
}
}
四、总结
通过以上步骤,我们已经成功将Shiro集成到Spring Boot项目中,并实现了用户认证和授权。在实际开发中,可以根据需求进行扩展,例如:添加角色管理、权限管理、会话管理等。
希望本文能帮助你轻松学会Shiro集成Spring Boot,实现高效权限管理。祝你学习愉快!