Spring Boot 集成 Apache Shiro 实现权限管理

在企业级应用开发中,权限管理和用户认证是非常重要的组成部分。Spring Boot 以其便捷的配置和快速的开发流程而受到开发者们的青睐。Apache Shiro 是一个强大且易用的 Java 安全框架,可以非常容易地开发出足够安全的应用。本文将介绍如何在 Spring Boot 应用中集成 Apache Shiro 来实现权限管理。

一、环境准备

  1. 开发工具

  2. IntelliJ IDEA 或 Eclipse

  3. Maven

  4. Java 11+

  5. 项目初始化

  6. 使用 Spring Initializr 创建一个新的 Spring Boot 项目。

  7. 添加 Web 和 JPA 依赖。

  8. 添加 Shiro 依赖: 在 pom.xml 文件中添加 Shiro 的相关依赖。

    xml

深色版本

复制代码
1<dependencies>
2    <!-- Shiro -->
3    <dependency>
4        <groupId>org.apache.shiro</groupId>
5        <artifactId>shiro-spring</artifactId>
6        <version>1.12.4</version>
7    </dependency>
8    <dependency>
9        <groupId>org.apache.shiro</groupId>
10        <artifactId>shiro-ehcache</artifactId>
11        <version>1.12.4</version>
12    </dependency>
13    <!-- 其他依赖 -->
14</dependencies>

二、配置文件

  1. application.properties

  2. properties

  3. 深色版本

  4. 1# Shiro 配置 2shiro.cacheManager.ehCacheManager.shared=true

  5. ShiroConfig.java: 这里我们定义 Shiro 的配置类。

    java

深色版本

复制代码
1@Configuration
2public class ShiroConfig {
3
4    @Bean
5    public SecurityManager securityManager() {
6        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
7        securityManager.setRealm(myShiroRealm());
8        securityManager.setCacheManager(cacheManager());
9        return securityManager;
10    }
11
12    @Bean
13    public MyShiroRealm myShiroRealm() {
14        return new MyShiroRealm();
15    }
16
17    @Bean
18    public CacheManager cacheManager() {
19        return new EhCacheManager();
20    }
21
22    @Bean
23    public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
24        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
25        factoryBean.setSecurityManager(securityManager);
26        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
27        // 设置匿名访问路径
28        filterChainDefinitionMap.put("/login", "anon");
29        // 设置需要认证的路径
30        filterChainDefinitionMap.put("/**", "authc");
31        factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
32        return factoryBean;
33    }
34}

三、自定义 Realm

  1. MyShiroRealm.java: 实现 AuthorizingRealm 接口来定义认证逻辑。

    java

深色版本

复制代码
1@Component
2public class MyShiroRealm extends AuthorizingRealm {
3
4    @Override
5    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
6        // 从 token 中获取用户名
7        String username = (String) token.getPrincipal();
8        // 查询数据库验证用户名和密码
9        if ("admin".equals(username) && "password".equals(token.getCredentials().toString())) {
10            return new SimpleAuthenticationInfo(username, "password", getName());
11        }
12        throw new UnknownAccountException();
13    }
14
15    @Override
16    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
17        String username = (String) principals.getPrimaryPrincipal();
18        // 查询数据库获取该用户的权限信息
19        if ("admin".equals(username)) {
20            SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
21            info.addRole("admin");
22            info.addStringPermission("user:read");
23            return info;
24        }
25        return null;
26    }
27}

四、控制器与视图

  1. LoginController.java: 实现登录功能。

    java

深色版本

复制代码
1@Controller
2public class LoginController {
3
4    @GetMapping("/login")
5    public String login() {
6        return "login";
7    }
8
9    @PostMapping("/login")
10    public String login(@RequestParam String username, @RequestParam String password, Model model) {
11        try {
12            Subject currentUser = SecurityUtils.getSubject();
13            UsernamePasswordToken token = new UsernamePasswordToken(username, password);
14            currentUser.login(token);
15            return "redirect:/dashboard";
16        } catch (UnknownAccountException e) {
17            model.addAttribute("error", "未知账户!");
18            return "login";
19        } catch (IncorrectCredentialsException e) {
20            model.addAttribute("error", "密码错误!");
21            return "login";
22        }
23    }
24}

五、总结

通过上述步骤,我们成功地在 Spring Boot 应用中集成了 Apache Shiro,并实现了基本的权限管理。当然,实际应用中还需要考虑更多的细节,比如更复杂的权限判断逻辑、异常处理、多数据源支持等。希望这篇博客能为你的项目提供一些有用的参考。

相关推荐
爱勇宝2 小时前
第 1 章:别把“需求文档”当成真正的需求
前端·后端·程序员
IT_陈寒6 小时前
闭包陷阱让我加了两天班,JavaScript你真行
前端·人工智能·后端
易协同低代码7 小时前
通达OA核心类库TD类深度解析
后端
Gopher_HBo7 小时前
Go语言学习笔记(十八)Gin处理Session
后端
谭光志8 小时前
工具塞满上下文窗口怎么办?深度拆解 AI Agent Tool Search 按需加载实现原理
前端·后端·ai编程
她说..8 小时前
Java 默认值设置方式
java·开发语言·后端·springboot
foggyprojects8 小时前
从0开始,一句话启动AI DataAgent
后端·数据分析·ai编程
郡杰8 小时前
一些基础和问题解决
后端
陈随易9 小时前
前端项目部署只要30秒
前端·后端·程序员
YIAN9 小时前
从零手写文件读取 MCP 服务:一文吃透 Model Context Protocol 全链路通信原理
前端·后端·mcp