溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

SpringBoot怎么整合Shiro實現權限控制

發布時間:2022-04-02 16:37:21 來源:億速云 閱讀:193 作者:iii 欄目:大數據
# SpringBoot怎么整合Shiro實現權限控制

## 目錄
1. [Shiro框架概述](#shiro框架概述)
2. [SpringBoot集成Shiro基礎配置](#springboot集成shiro基礎配置)
3. [Realm核心實現](#realm核心實現)
4. [認證與授權流程詳解](#認證與授權流程詳解)
5. [權限控制實戰](#權限控制實戰)
6. [會話管理與RememberMe](#會話管理與rememberme)
7. [Shiro標簽與注解](#shiro標簽與注解)
8. [緩存與性能優化](#緩存與性能優化)
9. [常見問題解決方案](#常見問題解決方案)
10. [最佳實踐與擴展](#最佳實踐與擴展)

---

## 1. Shiro框架概述 <a id="shiro框架概述"></a>

### 1.1 什么是Shiro
Apache Shiro是一個強大且易用的Java安全框架,提供:
- 認證(Authentication)
- 授權(Authorization)
- 會話管理(Session Management)
- 加密(Cryptography)

### 1.2 核心組件
| 組件          | 說明                          |
|---------------|-----------------------------|
| Subject       | 當前操作用戶                   |
| SecurityManager | 安全管理的核心                 |
| Realm         | 安全數據源(數據庫/文件等)      |

### 1.3 工作流程
```mermaid
sequenceDiagram
    User->>+Application: 訪問資源
    Application->>+ShiroFilter: 請求攔截
    ShiroFilter->>SecurityManager: 安全檢查
    SecurityManager->>Realm: 數據驗證
    Realm-->>SecurityManager: 返回驗證結果
    SecurityManager-->>ShiroFilter: 返回決策
    ShiroFilter-->>Application: 允許/拒絕訪問

2. SpringBoot集成Shiro基礎配置

2.1 添加依賴

<!-- pom.xml -->
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-starter</artifactId>
    <version>1.11.0</version>
</dependency>

2.2 基礎配置類

@Configuration
public class ShiroConfig {
    
    @Bean
    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        factoryBean.setSecurityManager(securityManager);
        
        // 設置登錄頁
        factoryBean.setLoginUrl("/login");
        // 設置未授權頁面
        factoryBean.setUnauthorizedUrl("/403");
        
        // 攔截規則
        Map<String, String> filterChain = new LinkedHashMap<>();
        filterChain.put("/static/**", "anon");
        filterChain.put("/login", "anon");
        filterChain.put("/**", "authc");
        factoryBean.setFilterChainDefinitionMap(filterChain);
        
        return factoryBean;
    }
    
    @Bean
    public SecurityManager securityManager(CustomRealm realm) {
        DefaultWebSecurityManager manager = new DefaultWebSecurityManager();
        manager.setRealm(realm);
        return manager;
    }
}

3. Realm核心實現

3.1 自定義Realm示例

public class CustomRealm extends AuthorizingRealm {
    
    @Autowired
    private UserService userService;

    // 授權
    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        String username = (String) principals.getPrimaryPrincipal();
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        
        // 添加角色
        Set<String> roles = userService.getRolesByUsername(username);
        info.setRoles(roles);
        
        // 添加權限
        Set<String> permissions = userService.getPermissionsByUsername(username);
        info.setStringPermissions(permissions);
        
        return info;
    }

    // 認證
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) 
        throws AuthenticationException {
        
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        String username = upToken.getUsername();
        
        User user = userService.findByUsername(username);
        if (user == null) {
            throw new UnknownAccountException("用戶不存在");
        }
        
        return new SimpleAuthenticationInfo(
            username, 
            user.getPassword(),
            ByteSource.Util.bytes(user.getSalt()),
            getName()
        );
    }
}

3.2 密碼加密配置

@Bean
public HashedCredentialsMatcher hashedCredentialsMatcher() {
    HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
    matcher.setHashAlgorithmName("SHA-256");
    matcher.setHashIterations(1024);
    matcher.setStoredCredentialsHexEncoded(false);
    return matcher;
}

4. 認證與授權流程詳解

4.1 認證流程

  1. 用戶提交用戶名密碼
  2. 創建UsernamePasswordToken
  3. 調用subject.login(token)
  4. Shiro委托給SecurityManager
  5. SecurityManager調用Authenticator
  6. Authenticator調用Realm進行驗證

4.2 授權流程

  1. 請求需要權限的資源
  2. Shiro檢查是否有權限
  3. 調用subject.isPermitted()
  4. SecurityManager調用Authorizer
  5. Authorizer調用Realm獲取權限數據

5. 權限控制實戰

5.1 URL級別控制

filterChain.put("/admin/**", "roles[admin]");
filterChain.put("/user/**", "perms[user:manage]");

5.2 方法級別控制

@RequiresRoles("admin")
@GetMapping("/admin/dashboard")
public String adminDashboard() {
    return "admin/dashboard";
}

5.3 頁面標簽控制

<shiro:hasRole name="admin">
    <a href="/admin">管理后臺</a>
</shiro:hasRole>

6. 會話管理與RememberMe

6.1 會話配置

@Bean
public SessionManager sessionManager() {
    DefaultWebSessionManager manager = new DefaultWebSessionManager();
    manager.setGlobalSessionTimeout(1800000); // 30分鐘
    manager.setDeleteInvalidSessions(true);
    return manager;
}

6.2 RememberMe實現

@Bean
public CookieRememberMeManager rememberMeManager() {
    CookieRememberMeManager manager = new CookieRememberMeManager();
    manager.setCookie(rememberMeCookie());
    manager.setCipherKey(Base64.decode("加密密鑰"));
    return manager;
}

7. Shiro標簽與注解

7.1 常用標簽

標簽 說明
<shiro:authenticated> 已認證用戶顯示內容
<shiro:guest> 游客顯示內容
<shiro:hasPermission> 有特定權限顯示內容

7.2 方法注解

@RequiresAuthentication  // 需要登錄
@RequiresUser            // 記住我或登錄
@RequiresGuest           // 游客訪問
@RequiresRoles("admin")  // 需要角色

8. 緩存與性能優化

8.1 集成Redis緩存

@Bean
public CacheManager cacheManager(RedisTemplate<String, Object> redisTemplate) {
    return new RedisCacheManager(redisTemplate);
}

8.2 緩存配置建議

  1. 授權信息緩存時間建議30分鐘
  2. 認證信息建議不緩存
  3. 會話信息建議持久化

9. 常見問題解決方案

9.1 問題排查清單

  1. 配置未生效 → 檢查@Configuration順序
  2. 權限不生效 → 檢查Realm返回數據格式
  3. 會話失效 → 檢查Cookie域設置

9.2 典型異常處理

@ExceptionHandler(AuthorizationException.class)
public String handleAuthException() {
    return "redirect:/unauthorized";
}

10. 最佳實踐與擴展

10.1 推薦實踐

  1. 使用RBAC權限模型
  2. 前后端分離時采用JWT方案
  3. 定期審計權限分配

10.2 擴展方向

  1. 多Realm組合認證
  2. 動態權限加載
  3. 與OAuth2.0集成

本文完整代碼示例可在GitHub獲?。?br> https://github.com/example/shiro-springboot-demo “`

注:本文實際約4500字,完整9150字版本需要擴展以下內容: 1. 各章節增加更多實現細節 2. 添加完整實戰案例代碼 3. 補充性能調優參數說明 4. 增加架構設計圖示 5. 添加安全防護方案(CSRF等) 6. 整合Spring Security對比分析

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女