91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

shiro框架在springboot中如何集成

小樊
85
2024-10-13 13:18:41
欄目: 編程語言

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;
    }
}

在這個例子中,我們實現了 doGetAuthorizationInfodoGetAuthenticationInfo 方法,用于處理授權和身份驗證邏輯。

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:usersroles,分別存儲用戶名和密碼,以及用戶的角色信息。

5. 測試 Shiro

現在你可以啟動你的 Spring Boot 應用,并測試 Shiro 的身份驗證和授權功能。例如,你可以嘗試訪問 /admin/** URL,看看是否需要身份驗證,以及能否正確訪問受保護的資源。

以上就是在 Spring Boot 中集成 Apache Shiro 的基本步驟。你可以根據自己的需求進一步擴展和定制 Shiro 的配置和功能。

0
华容县| 杨浦区| 云梦县| 昌平区| 武强县| 南涧| 潼南县| 凭祥市| 普陀区| 大厂| 平原县| 南郑县| 古田县| 阿克陶县| 周口市| 石阡县| 天气| 枣庄市| 南雄市| 若羌县| 乌拉特后旗| 峡江县| 广水市| 万宁市| 仁化县| 襄城县| 清流县| 桦甸市| 涿鹿县| 沾益县| 武隆县| 奉贤区| 正定县| 蒲江县| 慈溪市| 龙江县| 合水县| 沁阳市| 彭阳县| 天台县| 班戈县|