概述
Apache Shiro是一个强大且易于使用的Java安全框架,提供认证、授权、加密和会话管理等功能。通过与Spring Boot集成,可以方便地实现权限控制和安全管理。
应用场景
- 用户登录和认证:使用Shiro进行用户的身份验证,确保用户输入的凭据正确。
- 角色和权限管理:基于用户角色分配权限,限制用户能够执行的操作。
- 注解式权限控制:在方法级别使用注解控制访问权限,简化代码实现。
- 会话管理:管理用户的会话状态,如登录时间、过期处理等。
- 密码加密:对用户密码进行加密存储,保证安全性。
示例代码
1. 添加Shiro依赖
首先,在pom.xml
文件中添加Spring Boot和Shiro的依赖:
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>1.8.0</version>
</dependency>
2. 配置Shiro
创建一个Shiro配置类,配置Shiro的安全管理器、Realm等:
@Configuration
public class ShiroConfig {
@Bean
public SecurityManager securityManager() {
DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
// 设置自定义Realm
securityManager.setRealm(myRealm());
return securityManager;
}
@Bean
public Realm myRealm() {
MyRealm realm = new MyRealm();
// 设置密码校验规则等
realm.setCredentialsMatcher(credentialsMatcher());
return realm;
}
@Bean
public CredentialsMatcher credentialsMatcher() {
return new HashedCredentialsMatcher("SHA-256");
}
@Bean
public ShiroFilterChainDefinition shiroFilterChainDefinition() {
DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
// 配置不需要拦截的路径
chainDefinition.addPathDefinition("/login", "anon");
// 配置需要认证的路径
chainDefinition.addPathDefinition("/**", "authc");
return chainDefinition;
}
}
3. 自定义Realm
创建一个自定义的Realm,用于处理用户的认证和授权逻辑:
public class MyRealm extends AuthorizingRealm {
@Autowired
private UserService userService;
// 用户认证
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
UsernamePasswordToken upToken = (UsernamePasswordToken) token;
String username = upToken.getUsername();
User user = userService.findByUsername(username);
if (user != null) {
return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
} else {
throw new UnknownAccountException("用户不存在");
}
}
// 用户授权
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
String username = (String) principals.getPrimaryPrincipal();
SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
// 查询用户角色和权限,设置到AuthorizationInfo中
User user = userService.findByUsername(username);
authorizationInfo.addRoles(user.getRoles());
authorizationInfo.addStringPermissions(user.getPermissions());
return authorizationInfo;
}
}
4. 控制器中使用Shiro
在Spring Boot的控制器中可以通过注解来实现权限控制:
@RestController
@RequestMapping("/api")
public class ExampleController {
@RequiresPermissions("user:list")
@GetMapping("/users")
public ResponseEntity<List<User>> getUsers() {
// 处理获取用户列表的业务逻辑
List<User> userList = userService.getAllUsers();
return ResponseEntity.ok(userList);
}
@RequiresRoles("admin")
@PostMapping("/user")
public ResponseEntity<String> createUser(@RequestBody User user) {
// 处理创建用户的业务逻辑
userService.createUser(user);
return ResponseEntity.ok("User created successfully");
}
}
总结
通过以上示例,可以看到如何使用Spring Boot集成Shiro来实现基本的权限控制。配置Shiro的安全管理器、Realm、过滤器链以及在控制器中使用注解来限制访问权限,能够帮助开发人员快速搭建安全可靠的应用程序。在实际开发中,可以根据具体的业务需求和安全要求进一步扩展和优化配置。