怎么用Springboot快速整合shiro安全框架

发布时间:2023-04-03 16:04:50 作者:iii
来源:亿速云 阅读:177

怎么用Spring Boot快速整合Shiro安全框架

目录

  1. 引言
  2. Shiro简介
  3. Spring Boot简介
  4. 环境准备
  5. 创建Spring Boot项目
  6. 引入Shiro依赖
  7. 配置Shiro
  8. 实现用户认证
  9. 实现用户授权
  10. 整合数据库
  11. redis缓存">使用Redis缓存
  12. 自定义Realm
  13. 配置Remember Me
  14. 配置Session管理
  15. 配置密码加密
  16. 配置多Realm
  17. 配置过滤器链
  18. 配置异常处理
  19. 配置日志
  20. 测试与验证
  21. 总结

引言

在现代Web应用开发中,安全性是一个不可忽视的重要方面。无论是用户认证、授权、会话管理还是密码加密,都需要开发者投入大量的精力去设计和实现。为了简化这些安全相关的开发工作,Apache Shiro应运而生。Shiro是一个强大且易用的Java安全框架,提供了全面的安全解决方案。

Spring Boot作为现代Java应用开发的利器,以其简洁的配置和快速的开发能力,深受开发者喜爱。将Shiro与Spring Boot结合使用,可以极大地提高开发效率,同时保证应用的安全性。

本文将详细介绍如何使用Spring Boot快速整合Shiro安全框架,涵盖从项目创建到配置、从用户认证到授权、从数据库整合到缓存使用等多个方面。通过本文的学习,您将能够轻松地在Spring Boot项目中集成Shiro,构建安全可靠的Web应用。

Shiro简介

Apache Shiro是一个强大且易用的Java安全框架,提供了认证、授权、加密和会话管理等功能。Shiro的设计目标是简化应用安全性的实现,使开发者能够专注于业务逻辑,而不必过多关注安全细节。

Shiro的核心概念

Shiro的优势

Spring Boot简介

Spring Boot是Spring框架的一个子项目,旨在简化Spring应用的初始搭建和开发过程。Spring Boot通过自动配置和约定优于配置的原则,极大地减少了开发者的配置工作,使得开发者能够快速构建和部署Spring应用。

Spring Boot的核心特性

Spring Boot的优势

环境准备

在开始整合Shiro和Spring Boot之前,我们需要准备好开发环境。以下是所需的环境和工具:

安装JDK

确保您的系统上已经安装了JDK,并且配置了环境变量。可以通过以下命令检查JDK版本:

java -version

安装Maven

Maven是Java项目的构建工具,用于管理项目依赖和构建过程。可以通过以下命令检查Maven版本:

mvn -v

如果未安装Maven,可以从Maven官网下载并安装。

安装IDE

推荐使用IntelliJ IDEA或Eclipse作为开发工具。IntelliJ IDEA提供了强大的Spring Boot支持,可以极大地提高开发效率。

创建Spring Boot项目

在准备好开发环境后,我们可以开始创建一个Spring Boot项目。Spring Boot提供了多种创建项目的方式,包括使用Spring Initializr、Maven或Gradle等。本文将使用Spring Initializr创建项目。

使用Spring Initializr创建项目

  1. 打开Spring Initializr
  2. 选择项目类型为Maven Project。
  3. 选择语言为Java。
  4. 选择Spring Boot版本为2.x。
  5. 填写项目元数据,如Group、Artifact、Name等。
  6. 添加依赖,选择Web、Thymeleaf、Security等依赖。
  7. 点击Generate按钮,下载生成的项目压缩包。
  8. 解压项目压缩包,并使用IDE导入项目。

项目结构

导入项目后,您将看到以下项目结构:

src
├── main
│   ├── java
│   │   └── com
│   │       └── example
│   │           └── demo
│   │               ├── DemoApplication.java
│   │               └── controller
│   │                   └── HomeController.java
│   └── resources
│       ├── application.properties
│       ├── static
│       └── templates
└── test
    └── java
        └── com
            └── example
                └── demo
                    └── DemoApplicationTests.java

运行项目

在IDE中运行DemoApplication.java,启动Spring Boot应用。访问http://localhost:8080,您将看到默认的欢迎页面。

引入Shiro依赖

在创建好Spring Boot项目后,我们需要引入Shiro的依赖。Shiro提供了多个模块,可以根据需求选择引入。本文将引入shiro-springshiro-web模块。

添加Maven依赖

pom.xml中添加以下依赖:

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- Spring Boot Starter Thymeleaf -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>

    <!-- Shiro Spring -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring</artifactId>
        <version>1.7.1</version>
    </dependency>

    <!-- Shiro Web -->
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-web</artifactId>
        <version>1.7.1</version>
    </dependency>

    <!-- Spring Boot Starter Security -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
</dependencies>

依赖说明

更新项目

在添加依赖后,使用Maven更新项目,确保依赖正确下载和配置。

mvn clean install

配置Shiro

在引入Shiro依赖后,我们需要配置Shiro,使其与Spring Boot应用集成。Shiro的配置主要包括SecurityManagerRealmFilter等。

创建Shiro配置类

src/main/java/com/example/demo/config目录下创建ShiroConfig.java文件,内容如下:

package com.example.demo.config;

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;

@Configuration
public class ShiroConfig {

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);

        // 配置拦截器链
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/static/**", "anon");
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/**", "authc");

        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        shiroFilterFactoryBean.setLoginUrl("/login");
        shiroFilterFactoryBean.setSuccessUrl("/home");
        shiroFilterFactoryBean.setUnauthorizedUrl("/403");

        return shiroFilterFactoryBean;
    }

    @Bean
    public DefaultWebSecurityManager securityManager(MyRealm myRealm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(myRealm);
        return securityManager;
    }

    @Bean
    public MyRealm myRealm() {
        return new MyRealm();
    }
}

配置说明

创建自定义Realm

src/main/java/com/example/demo/realm目录下创建MyRealm.java文件,内容如下:

package com.example.demo.realm;

import org.apache.shiro.authc.*;
import org.apache.shiro.realm.AuthenticatingRealm;

public class MyRealm extends AuthenticatingRealm {

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = (String) token.getPrincipal();
        String password = new String((char[]) token.getCredentials());

        // 模拟从数据库获取用户信息
        if (!"admin".equals(username)) {
            throw new UnknownAccountException("用户不存在");
        }

        if (!"123456".equals(password)) {
            throw new IncorrectCredentialsException("密码错误");
        }

        return new SimpleAuthenticationInfo(username, password, getName());
    }
}

Realm说明

实现用户认证

在配置好Shiro后,我们可以实现用户认证功能。用户认证是指验证用户的身份,确保用户是合法的。

创建登录页面

src/main/resources/templates目录下创建login.html文件,内容如下:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Login</title>
</head>
<body>
    <h1>Login</h1>
    <form th:action="@{/login}" method="post">
        <div>
            <label for="username">Username:</label>
            <input type="text" id="username" name="username" required>
        </div>
        <div>
            <label for="password">Password:</label>
            <input type="password" id="password" name="password" required>
        </div>
        <div>
            <button type="submit">Login</button>
        </div>
    </form>
</body>
</html>

创建登录控制器

src/main/java/com/example/demo/controller目录下创建LoginController.java文件,内容如下:

package com.example.demo.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class LoginController {

    @GetMapping("/login")
    public String login() {
        return "login";
    }
}

测试登录功能

启动Spring Boot应用,访问http://localhost:8080/login,输入用户名admin和密码123456,点击登录按钮。如果认证成功,将跳转到/home页面。

实现用户授权

用户授权是指控制用户对资源的访问权限。Shiro提供了丰富的授权功能,可以根据角色或权限控制用户访问。

创建用户角色和权限

MyRealm.java中添加以下代码,模拟用户角色和权限:

@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
    SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
    String username = (String) principals.getPrimaryPrincipal();

    // 模拟从数据库获取用户角色和权限
    if ("admin".equals(username)) {
        authorizationInfo.addRole("admin");
        authorizationInfo.addStringPermission("user:view");
        authorizationInfo.addStringPermission("user:edit");
    } else if ("user".equals(username)) {
        authorizationInfo.addRole("user");
        authorizationInfo.addStringPermission("user:view");
    }

    return authorizationInfo;
}

配置授权拦截器

ShiroConfig.java中配置授权拦截器:

filterChainDefinitionMap.put("/user/view", "perms[user:view]");
filterChainDefinitionMap.put("/user/edit", "perms[user:edit]");

创建用户控制器

src/main/java/com/example/demo/controller目录下创建UserController.java文件,内容如下:

package com.example.demo.controller;

import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class UserController {

    @GetMapping("/user/view")
    @RequiresPermissions("user:view")
    public String viewUser() {
        return "user/view";
    }

    @GetMapping("/user/edit")
    @RequiresPermissions("user:edit")
    public String editUser() {
        return "user/edit";
    }
}

创建用户页面

src/main/resources/templates/user目录下创建view.htmledit.html文件,内容如下:

view.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>View User</title>
</head>
<body>
    <h1>View User</h1>
    <p>This is the user view page.</p>
</body>
</html>

edit.html:

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Edit User</title>
</head>
<body>
    <h1>Edit User</h1>
    <p>This is the user edit page.</p>
</body>
</html>

测试授权功能

启动Spring Boot应用,访问http://localhost:8080/user/viewhttp://localhost:8080/user/edit,验证用户授权功能。只有具有相应权限的用户才能访问这些页面。

整合数据库

在实际应用中,用户信息和权限信息通常存储在数据库中。Shiro可以与数据库集成,实现动态的用户认证和授权。

引入数据库依赖

pom.xml中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <scope>runtime</scope>
</dependency>

配置数据库

application.properties中添加以下配置:

spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.username=sa
spring.datasource.password=password
spring.jpa.database-platform=org.hibernate.dialect.H2Dialect
spring.h2.console.enabled=true

创建用户实体

src/main/java/com/example/demo/entity目录下创建User.java文件,内容如下:

package com.example.demo.entity;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String username;
    private String password;
    private String role;

    // Getters and Setters
}

创建用户仓库

src/main/java/com/example/demo/repository目录下创建UserRepository.java文件,内容如下:

package com.example.demo.repository;

import com.example.demo.entity.User;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

修改Realm

MyRealm.java中修改doGetAuthenticationInfodoGetAuthorizationInfo方法,使用数据库中的用户信息进行认证和授权:

”`java @Autowired private UserRepository userRepository;

@Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException { String username = (String) token.getPrincipal();

推荐阅读:
  1. ​ Python和Java中二选一应该怎么选
  2. Java和Python的对比案例

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

java springboot shiro

上一篇:YOLOv5模型优化与部署的方法是什么

下一篇:SpringBoot启动流程SpringApplication源码分析

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》