Spring Boot Shiro 配置详解:入门教程及关闭方法

本文将详细介绍如何在 Spring Boot 项目中集成 Apache Shiro 进行安全管理,从基本配置到自定义 Realm,以及如何关闭 Shiro 功能,并提供代码示例。

1. 添加依赖

pom.xml 文件中添加 Shiro 依赖:

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.8.0</version>
</dependency>

2. 基本配置

创建 ShiroConfig 类,并使用 @Configuration 注解将其标记为配置类:

package com.kj.shiro;

import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.realm.Realm;
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;

import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author 破晓
 * @date 2022-01-22 22:15
 */
@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        // 设置默认登录的 URL,身份认证失败会访问该 URL
        shiroFilterFactoryBean.setLoginUrl("/login");
        // 设置成功之后要跳转的链接
        shiroFilterFactoryBean.setSuccessUrl("/");
        // 设置未授权界面,权限认证失败会访问该 URL
        shiroFilterFactoryBean.setUnauthorizedUrl("/unauthorized");

        // LinkedHashMap 是有序的,进行顺序拦截器配置
        Map<String, String> filterChainMap  = new LinkedHashMap<>();
        /*
               1). anon 可以被匿名访问
               2). authc 必须认证(登录)后才可以访问
               ......
        */
        filterChainMap.put("/**","anon");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainMap);
        return shiroFilterFactoryBean;
    }

    @Bean
    public SecurityManager securityManager(Realm singleRealm){
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(singleRealm);
        return securityManager;
    }
}

3. 自定义 Realm

创建一个 CustomRealm 类,并实现 Realm 接口,用于处理用户身份验证和授权:

package com.kj.shiro;

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.Arrays;
import java.util.HashSet;
import java.util.Set;

public class CustomRealm extends AuthorizingRealm {

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        // 获取用户名
        String username = (String) token.getPrincipal();
        // 模拟数据库查询用户信息,根据用户名获取密码
        String password = "123456";
        if (username == null || password == null) {
            throw new UnknownAccountException("用户名或密码错误");
        }
        // 返回 AuthenticationInfo 对象,用于封装用户信息
        SimpleAuthenticationInfo info = new SimpleAuthenticationInfo(username, password, getName());
        return info;
    }

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // 获取用户名
        String username = (String) principals.getPrimaryPrincipal();
        // 模拟数据库查询用户权限,根据用户名获取角色和权限
        Set<String> roles = new HashSet<>(Arrays.asList("admin", "user"));
        Set<String> permissions = new HashSet<>(Arrays.asList("user:read", "user:write"));
        // 返回 AuthorizationInfo 对象,用于封装角色和权限信息
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        info.setRoles(roles);
        info.setStringPermissions(permissions);
        return info;
    }
}

4. 关闭 Shiro

要关闭 Shiro,只需将 ShiroConfig 类中的 @Configuration 注解注释掉即可:

// @Configuration
public class ShiroConfig {
    // ...
}

总结

本文介绍了如何在 Spring Boot 项目中集成 Apache Shiro 进行安全管理,包括基本配置、自定义 Realm 和关闭 Shiro 功能,并提供了相应的代码示例。希望本文能帮助您快速掌握 Shiro 的基本使用,并能根据实际需求进行扩展。

Spring Boot Shiro 配置详解:入门教程及关闭方法

原文地址: https://www.cveoy.top/t/topic/nFaX 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录