当前位置: 首页 > article >正文

Spring Boot 整合 Shiro详解

文章目录

  • Spring Boot 整合 Shiro详解
    • 一、引言
    • 二、整合步骤
      • 1、创建项目并引入依赖
      • 2、配置Shiro
        • 2.1、自定义Realm
        • 2.2、配置SecurityManager和ShiroFilterFactoryBean
    • 三、使用示例
    • 四、总结

Spring Boot 整合 Shiro详解

在这里插入图片描述

一、引言

在现代的Web应用开发中,用户认证和授权是必不可少的安全措施。Apache Shiro是一个功能强大且易于使用的Java安全项目,提供了认证、授权、加密和会话管理等功能。Spring Boot作为一个流行的Java应用开发框架,与Shiro的整合可以极大地简化安全配置和管理。本文将详细介绍如何在Spring Boot应用中整合Shiro,实现用户认证和授权功能。

二、整合步骤

1、创建项目并引入依赖

首先,使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖:

xml复制

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.11.0</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>

这些依赖分别用于Web开发、Shiro安全框架、Thymeleaf模板引擎、Lombok简化代码编写以及测试框架。

2、配置Shiro

接下来,需要配置Shiro的相关组件,包括自定义Realm、SecurityManager和ShiroFilterFactoryBean等。

2.1、自定义Realm

创建一个自定义Realm类,用于实现用户认证和授权的逻辑:

java复制

package com.example.demo.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 org.springframework.beans.factory.annotation.Autowired;
import com.example.demo.service.UserService;

public class CustomRealm extends AuthorizingRealm {
    @Autowired
    private UserService userService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        String username = (String) principals.getPrimaryPrincipal();
        User user = userService.findByUsername(username);
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        user.getRoles().forEach(role -> authorizationInfo.addRole(role.getRoleName()));
        user.getRoles().forEach(role -> role.getPermissions().forEach(permission -> authorizationInfo.addStringPermission(permission.getPermissionsName())));
        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        User user = userService.findByUsername(username);
        if (user == null) {
            throw new UnknownAccountException("用户不存在");
        }
        return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
    }
}

在这个自定义Realm中,doGetAuthorizationInfo方法用于获取用户的授权信息,包括角色和权限;doGetAuthenticationInfo方法用于验证用户的登录信息。

2.2、配置SecurityManager和ShiroFilterFactoryBean

创建Shiro配置类,配置SecurityManager和ShiroFilterFactoryBean:

java复制

package com.example.demo.config;

import org.apache.shiro.mgt.SecurityManager;
import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import com.example.demo.shiro.CustomRealm;

@Configuration
public class ShiroConfig {
    @Bean
    public CustomRealm customRealm() {
        return new CustomRealm();
    }

    @Bean
    public SecurityManager securityManager() {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(customRealm());
        return securityManager;
    }

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/register", "anon");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setLoginUrl("/login");
        shiroFilterFactoryBean.setSuccessUrl("/index");
        shiroFilterFactoryBean.setUnauthorizedUrl("/error");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

    @Bean
    public DefaultAdvisorAutoProxyCreator defaultAdvisorAutoProxyCreator() {
        DefaultAdvisorAutoProxyCreator defaultAAP = new DefaultAdvisorAutoProxyCreator();
        defaultAAP.setProxyTargetClass(true);
        return defaultAAP;
    }

    @Bean
    public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
        AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
        authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
        return authorizationAttributeSourceAdvisor;
    }
}

在这个配置类中,customRealm方法创建并返回自定义Realm实例;securityManager方法配置SecurityManager并设置自定义Realm;shiroFilterFactoryBean方法配置ShiroFilterFactoryBean,定义了请求的过滤规则,如登录页面和需要认证的页面等;defaultAdvisorAutoProxyCreatorauthorizationAttributeSourceAdvisor方法用于开启Shiro的AOP支持,以便在方法调用时进行权限检查。

三、使用示例

在整合了Shiro之后,我们可以在Controller中使用Shiro提供的注解来控制方法的访问权限。例如:

java复制

package com.example.demo.controller;

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {
    @GetMapping("/index")
    public String index() {
        return "欢迎来到主页";
    }

    @GetMapping("/admin")
    @RequiresRoles("admin")
    public String admin() {
        return "欢迎来到管理员页面";
    }

    @GetMapping("/user")
    @RequiresPermissions("user:view")
    public String user() {
        return "欢迎来到用户页面";
    }
}

在上面的代码中,@RequiresRoles("admin")注解表示只有拥有"admin"角色的用户才能访问/admin页面;@RequiresPermissions("user:view")注解表示只有拥有"user:view"权限的用户才能访问/user页面。

四、总结

通过上述步骤,我们成功地在Spring Boot应用中整合了Shiro,实现了用户认证和授权功能。自定义Realm类负责处理用户认证和授权的逻辑,Shiro配置类则配置了SecurityManager和ShiroFilterFactoryBean等组件。在Controller中,可以使用Shiro提供的注解来控制方法的访问权限,从而实现细粒度的权限管理。这种整合方式不仅简化了安全配置,还提高了应用的安全性和可维护性。


版权声明:本博客内容为原创,转载请保留原文链接及作者信息。

参考文章

  • SpringBoot整合Shiro(详细教程分析)_springboot shiro-CSDN博客
  • Spring Boot整合 Apache Shiro实现认证和授权功能(入门篇)_spring boot shiro-CSDN博客

http://www.kler.cn/a/510185.html

相关文章:

  • MongoDB 学习指南与资料分享
  • [计算机网络]一. 计算机网络概论第一部分
  • 深入内核讲明白Android Binder【二】
  • OpenCV基础:获取子矩阵的几种方式
  • 第4章 Kafka核心API——Kafka客户端操作
  • ubuntu开机自启某个应用
  • 在线图片转为excel工具
  • Golang Gin系列-4:Gin Framework入门教程
  • Python自动化测试中定位隐藏菜单元素的策略
  • html的iframe页面给帆软BI发送消息
  • 具身导航如何利用取之不尽的网络视频资源!RoomTour3D:基于几何感知的视频-指令训练调优
  • Web前端开发技术之HTMLCSS知识点总结
  • 用nginx正向代理https网站
  • 数据结构(链表 哈希表)
  • LeetCode:78.子集
  • AI面板识别
  • 统计学习算法——决策树
  • Hadoop•用Web UI查看Hadoop状态词频统计
  • Spring Boot + Apache POI 实现 Excel 导出:BOM物料清单生成器(支持中文文件名、样式美化、数据合并)
  • 学习threejs,使用FlyControls相机控制器
  • 速通Docker === 目录挂载 卷映射
  • 02JavaWeb——JavaScript-Vue(项目实战)
  • 【机器学习实战中阶】音乐流派分类-自动化分类不同音乐风格
  • Springboot之错误端点/error
  • 两个关于TCP/IP的问题
  • 搜维尔科技:Xsens人形机器人解决方案的优势