Apache Shiro 是一个强大且易用的 Java 安全框架,用于身份验证、授权、加密和会话管理。在 Spring Boot 中集成 Shiro 相对简单,以下是一些关键步骤:
1. 添加依赖
首先,在你的 pom.xml
文件中添加 Shiro 和 Spring Boot Shiro 相关的依赖:
<dependencies> <!-- Shiro Core --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-core</artifactId> <version>1.7.1</version> </dependency> <!-- Spring Boot Shiro Starter --> <dependency> <groupId>org.apache.shiro</groupId> <artifactId>shiro-spring-boot-starter</artifactId> <version>1.7.1</version> </dependency> <!-- Spring Boot Starter Web --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
确保你使用的 Shiro 和 Spring Boot 版本兼容。
2. 配置 Shiro
创建一个配置类来设置 Shiro。例如,你可以创建一个名为 ShiroConfig
的类:
import org.apache.shiro.mgt.SecurityManager; import org.apache.shiro.spring.web.ShiroFilterFactoryBean; import org.apache.shiro.web.mgt.DefaultWebSecurityManager; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class ShiroConfig { @Bean public SecurityManager securityManager() { DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); // 设置用户和角色 securityManager.setRealm(myRealm()); return securityManager; } @Bean public MyRealm myRealm() { return new MyRealm(); } @Bean public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) { ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); shiroFilterFactoryBean.setSecurityManager(securityManager); // 配置过滤器链 Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>(); filterChainDefinitionMap.put("/admin/**", "authc"); filterChainDefinitionMap.put("/**", "anon"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); return shiroFilterFactoryBean; } }
在这个例子中,我们定义了一个自定义的 Realm(MyRealm
),用于处理身份验证和授权逻辑。ShiroFilterFactoryBean
用于配置过滤器链,定义哪些 URL 需要身份验证,哪些不需要。
3. 实现自定义 Realm
创建一个自定义的 Realm 类来实现 org.apache.shiro.realm.AuthorizingRealm
接口。例如:
import org.apache.shiro.authc.*; import org.apache.shiro.authz.AuthorizationInfo; import org.apache.shiro.authz.SimpleAuthorizationInfo; import org.apache.shiro.realm.AuthorizingRealm; import org.apache.shiro.subject.PrincipalCollection; import java.util.HashSet; import java.util.Set; public class MyRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { String username = (String) principals.getPrimaryPrincipal(); // 查询用户角色和权限 Set<String> roles = getRolesForUser(username); Set<String> permissions = getPermissionsForUser(username); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); authorizationInfo.setRoles(roles); authorizationInfo.setStringPermissions(permissions); return authorizationInfo; } @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { UsernamePasswordToken upToken = (UsernamePasswordToken) token; String username = upToken.getUsername(); // 查询用户信息 User user = getUserByUsername(username); if (user == null) { throw new UnknownAccountException("用户不存在"); } return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName()); } private Set<String> getRolesForUser(String username) { // 实现获取用户角色的逻辑 return new HashSet<>(); } private Set<String> getPermissionsForUser(String username) { // 实现获取用户权限的逻辑 return new HashSet<>(); } private User getUserByUsername(String username) { // 实现根据用户名查询用户的逻辑 return null; } }
在这个例子中,我们实现了 doGetAuthorizationInfo
和 doGetAuthenticationInfo
方法,用于处理授权和身份验证逻辑。
4. 创建用户和角色
你需要创建一些用户和角色数据来测试 Shiro。这些数据可以存储在数据库中,或者简单地硬编码在配置类中。例如:
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import java.util.HashMap; import java.util.Map; @Configuration public class UserRolesConfig { @Bean public Map<String, String> users() { Map<String, String> users = new HashMap<>(); users.put("admin", "admin_password"); users.put("user", "user_password"); return users; } @Bean public Map<String, Set<String>> roles() { Map<String, Set<String>> roles = new HashMap<>(); Set<String> adminRoles = new HashSet<>(); adminRoles.add("admin"); roles.put("admin", adminRoles); Set<String> userRoles = new HashSet<>(); userRoles.add("user"); roles.put("user", userRoles); return roles; } }
在这个例子中,我们定义了两个 Bean:users
和 roles
,分别存储用户名和密码,以及用户的角色信息。
5. 测试 Shiro
现在你可以启动你的 Spring Boot 应用,并测试 Shiro 的身份验证和授权功能。例如,你可以尝试访问 /admin/**
URL,看看是否需要身份验证,以及能否正确访问受保护的资源。
以上就是在 Spring Boot 中集成 Apache Shiro 的基本步骤。你可以根据自己的需求进一步扩展和定制 Shiro 的配置和功能。