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,并实现了基本的权限管理。当然,实际应用中还需要考虑更多的细节,比如更复杂的权限判断逻辑、异常处理、多数据源支持等。希望这篇博客能为你的项目提供一些有用的参考。

相关推荐
wn53143 分钟前
【Go - 类型断言】
服务器·开发语言·后端·golang
bjzhang751 小时前
SpringBoot开发——集成Tess4j实现OCR图像文字识别
spring boot·ocr·tess4j
flying jiang1 小时前
Spring Boot 入门面试五道题
spring boot
小菜yh1 小时前
关于Redis
java·数据库·spring boot·redis·spring·缓存
希冀1231 小时前
【操作系统】1.2操作系统的发展与分类
后端
GoppViper2 小时前
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
笔记·git·后端·学习·golang·github·源代码管理
爱上语文3 小时前
Springboot的三层架构
java·开发语言·spring boot·后端·spring
荆州克莱3 小时前
springcloud整合nacos、sentinal、springcloud-gateway,springboot security、oauth2总结
spring boot·spring·spring cloud·css3·技术
serve the people3 小时前
springboot 单独新建一个文件实时写数据,当文件大于100M时按照日期时间做文件名进行归档
java·spring boot·后端
罗政8 小时前
[附源码]超简洁个人博客网站搭建+SpringBoot+Vue前后端分离
vue.js·spring boot·后端