Apache Shiro 是一個強大且易用的 Java 安全框架,用于身份驗證、授權、加密和會話管理。在 Spring Boot 中集成 Shiro 相對簡單,以下是一些關鍵步驟:
首先,在你的 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 版本兼容。
創建一個配置類來設置 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 需要身份驗證,哪些不需要。
創建一個自定義的 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
方法,用于處理授權和身份驗證邏輯。
你需要創建一些用戶和角色數據來測試 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
,分別存儲用戶名和密碼,以及用戶的角色信息。
現在你可以啟動你的 Spring Boot 應用,并測試 Shiro 的身份驗證和授權功能。例如,你可以嘗試訪問 /admin/**
URL,看看是否需要身份驗證,以及能否正確訪問受保護的資源。
以上就是在 Spring Boot 中集成 Apache Shiro 的基本步驟。你可以根據自己的需求進一步擴展和定制 Shiro 的配置和功能。