JAVA: Spring Boot加载 Shiro 配置 >>找不到 SecurityManager

发布于:2024-04-26 ⋅ 阅读:(18) ⋅ 点赞:(0)

在 Spring Boot 应用中集成和配置 Apache Shiro 通常涉及创建一个配置类来设置 `SecurityManager`,以及定义 Shiro 的 Web 支持和必要的安全策略。下面是使用 Spring Boot 配置 Apache Shiro 的步骤:

### 1. 添加依赖
首先,确保在你的 `pom.xml` 或 `build.gradle` 文件中添加了 Apache Shiro 的依赖项。例如,如果你使用 Maven,你可以添加如下依赖:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.8.0</version> <!-- 请使用最新的兼容版本 -->
</dependency>
<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-web</artifactId>
    <version>1.8.0</version> <!-- 请使用最新的兼容版本 -->
</dependency>

### 2. 配置 Shiro
创建一个配置类,用于定义 Shiro 的 `SecurityManager`,以及配置 Shiro 的认证和授权策略。这个类可以使用 `@Configuration` 标记,表明它是 Spring 的一个配置类。

import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.web.config.DefaultShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroFilterChainDefinition;
import org.apache.shiro.spring.web.config.ShiroWebFilterConfiguration;
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();
        // 配置Realm,可以是自定义的Realm,处理登录和授权等
        return securityManager;
    }

    @Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
        // 配置路径过滤规则,例如认证、授权等
        chainDefinition.addPathDefinition("/admin/**", "authc, roles[admin]");
        chainDefinition.addPathDefinition("/login*", "anon");
        chainDefinition.addPathDefinition("/**", "authc");
        return chainDefinition;
    }

    // 创建 ShiroFilterFactoryBean,它是 Shiro 与 Spring Boot 集成的桥梁
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager, ShiroFilterChainDefinition shiroFilterChainDefinition) {
        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
        shiroFilter.setSecurityManager(securityManager);
        shiroFilter.setFilterChainDefinitionMap(shiroFilterChainDefinition.getFilterChainMap());
        shiroFilter.setLoginUrl("/login");
        shiroFilter.setSuccessUrl("/index");
        shiroFilter.setUnauthorizedUrl("/unauthorized");
        return shiroFilter;
    }
}

### 3. 配置 Realm
`Realm` 是 Shiro 连接到应用程序安全数据的桥梁,如用户帐户等。通常你需要实现你自己的 `Realm`:

import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.subject.PrincipalCollection;

public class MyCustomRealm extends AuthorizingRealm {
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // 此处编写获取用户信息的逻辑
        return new SimpleAuthenticationInfo("user", "password", getName());
    }
}

将此 `Realm` 集成到你的 `SecurityManager` 配置中。

### 4. 启动类中激活配置
确保 Spring Boot 的主类(带有 `@SpringBootApplication` 注解的类)能够通过组件扫描找到这个配置类。通常,这不需要额外的步骤,只要配置类在相同的包或子包中。

### 5. 测试配置
启动你的 Spring Boot 应用并访问不同的 URL,验证安全

策略(如登录、角色检查)是否按预期工作。

以上步骤提供了一个基础框架,你可以在此基础上根据应用需求添加更多的自定义安全逻辑和功能。