Spring Boot集成Shiro實現權限管理

一、概述

Shiro是一個Java安全框架,提供了身份驗證、授權、密碼加密和會話管理等功能。可以集成到任何Java應用程序中,包括Web、REST API和大數據架構等。Spring Boot是一個使創建Spring應用程序更容易的框架,提供了自動配置和約定大於配置的方式。集成Shiro和Spring Boot可以快速實現安全和權限管理。

二、集成Shiro

在Spring Boot中集成Shiro有多種方式,可以手動配置,也可以使用starter快速集成。下面以使用starter為例,介紹如何集成。

1. 添加依賴


<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-starter</artifactId>
    <version>1.7.1</version>
</dependency>

2. 配置Shiro

在application.properties中添加Shiro的配置:


shiro:
  loginUrl: /login
  successUrl: /index
  unauthorizedUrl: /403
  # 自定義ShiroFilterFactoryBean
  filters:
    myFilter: cn.example.MyFilter
  filterChainDefinitions: 
    # 匿名訪問
    /anonymous/** = anon
    # 記住我功能
    /rememberMe/** = user
    # 登錄頁面和登錄請求
    /login/** = anon
    # 其他請求需要認證
    /** = myFilter

其中,loginUrl、successUrl和unauthorizedUrl分別表示登錄頁面、登錄成功後跳轉的頁面和沒有權限時訪問的頁面。filterChainDefinitions指定請求的過濾器。

3. 配置SecurityManager

在配置類中添加SecurityManager:


@Bean
public SecurityManager securityManager() {
    DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
    securityManager.setRealm(myRealm()); // 設置Realm
    securityManager.setSessionManager(sessionManager()); // 設置SessionManager
    return securityManager;
}

4. 配置Realm

自定義Realm需要繼承org.apache.shiro.realm.AuthorizingRealm類,並實現doGetAuthenticationInfo和doGetAuthorizationInfo方法:


public class MyRealm extends AuthorizingRealm {

    // 授權
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // 獲取當前用戶
        String username = (String) principals.getPrimaryPrincipal();
        // 根據用戶名從數據庫中獲取角色和權限信息
        Set<String> roles = userDao.findRoles(username);
        Set<String> permissions = userDao.findPermissions(username);
        // 將角色和權限信息封裝到AuthorizationInfo中
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        authorizationInfo.setRoles(roles);
        authorizationInfo.setStringPermissions(permissions);
        return authorizationInfo;
    }

    // 認證
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        User user = userDao.findByUsername(username);
        if (user == null) {
            throw new UnknownAccountException("賬戶不存在");
        }
        SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo(username, user.getPassword(), getName());
        return authenticationInfo;
    }
}

5. 配置SessionManager

在SecurityManager中必須配置SessionManager,Spring Boot中可以使用org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler類實現會話管理:


@Bean
public SessionManager sessionManager() {
    ServletContainerSessionManager sessionManager = new ServletContainerSessionManager();
    sessionManager.setSessionValidationSchedulerEnabled(true); // 開啟會話調度
    sessionManager.setSessionValidationScheduler(getSessionValidationScheduler()); // 設置會話調度器
    sessionManager.setGlobalSessionTimeout(3600000); // 設置會話過期時間
    sessionManager.setSessionIdCookieEnabled(true); // 允許客戶端攜帶Session ID Cookie
    return sessionManager;
}

private ExecutorServiceSessionValidationScheduler getSessionValidationScheduler() {
    ExecutorServiceSessionValidationScheduler scheduler = new ExecutorServiceSessionValidationScheduler();
    scheduler.setInterval(1800000); // 設置會話驗證間隔為30分鐘
    scheduler.setSessionFactory(((DefaultSessionManager) securityManager().getSessionManager()).getSessionFactory());
    return scheduler;
}

三、實現權限管理

1. 基於註解的權限控制

可以使用@RequiresPermissions註解實現對方法或類的訪問控制,如下所示:


@RequiresPermissions("user:list")
@RequestMapping("/list")
public String list() {
    return "user/list";
}

在上述代碼中,如果當前用戶沒有user:list這個權限,則無法訪問/list路徑。

2. 基於URL的權限控制

可以使用filterChainDefinitions屬性配置URL的訪問控制規則,如下所示:


filterChainDefinitions: 
    # 匿名訪問
    /anonymous/** = anon
    # 記住我功能
    /rememberMe/** = user
    # 登錄頁面和登錄請求
    /login/** = anon
    # 其他請求需要認證
    /** = myFilter

在上述代碼中,/anonymous路徑可以匿名訪問,/rememberMe路徑需要經過認證,/login路徑可以匿名訪問,其他路徑需要經過自定義的過濾器myFilter處理。

3. 實現Remember Me功能

使用Shiro可以實現Remember Me功能,下面是相關代碼:


@Bean
public RememberMeManager rememberMeManager() {
    CookieRememberMeManager rememberMeManager = new CookieRememberMeManager();
    rememberMeManager.setCookie(simpleCookie());
    return rememberMeManager;
}

@Bean
public SimpleCookie simpleCookie() {
    SimpleCookie cookie = new SimpleCookie("rememberMe");
    cookie.setMaxAge(604800); // 設置Cookie過期時間為7天
    return cookie;
}

在上述代碼中,設置Cookie的過期時間並注入到RememberMeManager中即可實現Remember Me功能。在登錄頁面簡單設置一下記住我即可啟用這個功能。

4. 實現Session管理

在SecurityManager中配置SessionManager即可實現Session管理。具體實現可以參考上述代碼中的sessionManager方法和getSessionValidationScheduler方法。

四、總結

通過本文的介紹,我們可以了解到Spring Boot集成Shiro的方法和實現權限管理的方式。Shiro提供了身份驗證、授權、密碼加密和會話管理等功能,可以很好地處理安全和權限相關的問題。在使用Shiro時,我們可以結合自己的應用場景來選擇使用基於註解的權限控制或基於URL的訪問控制。同時,通過Remember Me和Session管理功能可以更好地保護用戶的安全和隱私。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/301545.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-30 16:09
下一篇 2024-12-30 16:09

相關推薦

發表回復

登錄後才能評論