Spring Boot Shiro在Web应用中的作用详解

Spring Boot Shiro 在 Web 应用中的作用详解

简介

Shiro 是一个用于 Java 应用的轻量级安全框架,提供了认证、授权、加密以及会话管理等功能,可以方便地集成进 Spring Boot 项目中使用和配置。本文将详细介绍在 Web 应用中使用 Spring Boot Shiro 的过程和作用。

步骤

1. 添加依赖项

在 pom.xml 文件中添加如下依赖项,Spring Boot Shiro 就被引入到项目中了。

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring-boot-starter</artifactId>
    <version>1.6.0</version>
</dependency>

2. 编写 Shiro 配置

在 Spring Boot 项目中,我们可以使用 @Configuration 注解为 Shiro 提供配置信息。

@Configuration
public class ShiroConfig {
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean filterFactoryBean = new ShiroFilterFactoryBean();
        filterFactoryBean.setSecurityManager(securityManager);
        filterFactoryBean.setLoginUrl("/login");
        filterFactoryBean.setSuccessUrl("/index");
        filterFactoryBean.setUnauthorizedUrl("/error");

        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/", "anon");
        filterChainDefinitionMap.put("/login", "anon");
        filterChainDefinitionMap.put("/logout", "logout");
        filterChainDefinitionMap.put("/static/**", "anon");
        filterChainDefinitionMap.put("/**", "authc");
        filterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

        return filterFactoryBean;
    }

    @Bean
    public DefaultWebSecurityManager securityManager(Realm realm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm);
        return securityManager;
    }

    @Bean
    public Realm realm() {
        return new MyRealm();
    }
}

ShiroFilterFactoryBean 用于创建 ShiroFilter 的工厂类,用以配置 Shiro 过滤器链。DefaultWebSecurityManager 是整个 Shiro 架构的核心,负责管理 Subject、Realm 和 Session 等。Realm 则会完成登陆认证和权限校验。

3. 编写自定义 Realm

Realm 用于实现具体的认证和授权逻辑。

public class MyRealm extends AuthorizingRealm {

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo();
        // 从数据库或者缓存中获取用户的角色和权限信息,并赋值给 authorizationInfo
        return authorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken usernamePasswordToken = (UsernamePasswordToken) token;
        String username = usernamePasswordToken.getUsername();
        // 从数据库中获取用户名对应的密码,然后返回一个 AuthenticationInfo 实例
        return new SimpleAuthenticationInfo(username, "password", getName());
    }
}

在 doGetAuthorizationInfo 方法中,我们可以从数据库或者缓存中获取用户的角色和权限信息,并通过 SimpleAuthorizationInfo 类赋值给 authorizationInfo 对象。在 doGetAuthenticationInfo 方法中,我们可以根据用户名密码查询数据库,返回一个 AuthenticationInfo 实例,用于 Shiro 的认证。

4. 在 Controller 中应用 Shiro

在项目中的 Controller 中,可以通过注解的方式实现对请求的权限控制。

@Controller
public class UserController {
    @RequestMapping("/user")
    @RequiresPermissions("user:list")
    public String getUserList() {
        // 权限校验成功,返回用户列表页面
        return "userList";
    }
}

注解 @RequiresPermissions 可以用于详细控制用户对某个请求是否具有访问权限。在本例中,当用户拥有 user:list 权限时,才能访问 /user 请求。

5. 编写登录页面

在登录页面中,我们可以使用 Shiro 提供的默认标签库,如 ShiroLackTag、ShiroPrincipalTag、ShiroPermissionTag 等。

<%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %>

<div class="container">
    <div class="card card-login mx-auto text-center">
        <div class="card-header">登&nbsp;&nbsp;&nbsp;录</div>
        <div class="card-body">
            <form method="post" action="/login">
                <div class="form-group">
                    <input type="text" class="form-control" name="username" placeholder="请输入用户名">
                    <input type="password" class="form-control" name="password" placeholder="请输入密码">
                </div>
                <div class="form-group">
                    <button type="submit" class="btn btn-primary btn-block">登录</button>
                </div>
            </form>
            <div class="text-right">没有账号?<a href="#">注册</a></div>
            <hr>
            <a href="#">忘记密码</a>
            <br>
            <shiro:hasRole name="admin">
                <a href="#">管理中心</a>
            </shiro:hasRole>
        </div>
    </div>
</div>

在本例中,我们使用了 Shiro 的 hasRole 标签,用于判断用户是否具有 admin 角色,并显示相应的链接。

示例

示例1:控制用户访问权限

假设我们要开发一个基于 Spring Boot 的博客系统,其中需要对用户的访问权限进行控制。如管理员可对博客进行管理、撰写和编辑,普通用户只能对博客进行浏览和评论等操作。

我们可以使用 Shiro 实现这样的控制,通过在 Controller 中使用 @RequiresPermissions 注解来标记用户对某个请求的访问权限,并在 MyRealm 的 doGetAuthorizationInfo 方法中获取用户的角色信息,再根据角色信息来判断用户是否有权限访问请求。

示例2:实现单点登录

假设我们有多个子系统,用户只需要在一个子系统中登录,就可以在其他子系统中进行访问操作,即实现了单点登录。为了保护用户信息的安全,我们采用 Shiro 进行身份认证和权限校验。

我们可以在每个子系统中都引入 Spring Boot Shiro,然后在每个子系统中配置相同的 Realm,这样用户在登录第一个子系统时,就会在 Realm 中记录下用户的身份信息和权限信息。当用户在访问其他子系统时,只需要通过 Shiro 的 Subject.doAuthenticate() 方法进行认证即可,无需再次输入用户名密码,实现了单点登录。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot Shiro在Web应用中的作用详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • FusionCharts图表显示双Y轴双(多)曲线

    要讲解“FusionCharts图表显示双Y轴双(多)曲线”,我们需要了解以下几个方面: FusionCharts的基本使用: FusionCharts是一种可以创建多种类型图表的强大JavaScript库。使用FusionCharts的步骤如下: 引入FusionCharts库文件; 创建一个用于显示图表的空间; 创建一个包含图表属性和数据的JSON对象;…

    Java 2023年6月15日
    00
  • Java日常练习题,每天进步一点点(39)

    首先,需要明确题目的大致意思:从数组中找出某个数的位置。这是一个较为基础的算法练习,主要是针对初学者对数组的使用以及查找算法的理解和掌握。 接下来,我们可以使用以下的方法来解决这个问题: 1.首先,我们需要定义一个数组,用来存储要查找的数字以及随机生成的其他数字。这里我们可以使用Java中的Random类来生成指定范围内的随机数字,代码如下: import …

    Java 2023年5月26日
    00
  • 零基础学Java:Java开发工具 Eclipse 安装过程创建第一个Java项目及Eclipse的一些基础使用技巧

    下面详细讲解“零基础学Java:Java开发工具 Eclipse 安装过程创建第一个Java项目及Eclipse的一些基础使用技巧”的完整攻略。 一、Eclipse的安装 首先,进入Eclipse官网https://www.eclipse.org/downloads/packages/installer,选择下载适合自己电脑操作系统的Eclipse版本。 下…

    Java 2023年5月24日
    00
  • Java设计模式之装饰模式详解

    Java设计模式之装饰模式详解 简介 装饰模式是一种结构型设计模式,它允许我们在不改变现有对象结构的情况下向其中添加新功能。 在装饰模式中,我们创建一个装饰器(Decorator)类,用于包装原有的类,并在原有基础上添加新的行为、状态或属性。这种方式实现了对原有类的扩展,同时也不影响原有类的行为。 设计原则 开放-封闭原则(Open-Closed Princ…

    Java 2023年5月26日
    00
  • Java实现简单的模板渲染

    感谢您的提问!下面是关于Java实现简单的模板渲染的攻略: 什么是模板渲染? 模板渲染是指将预先定义好的模板文件中的数据和样式数据结合起来,生成最终的HTML文件或者其他文本格式的文件的过程。 如何实现模板渲染? 在Java中,我们可以通过使用模板引擎来实现模板渲染。一般来说,模板引擎需要支持一定的模板语言,可以方便我们在模板文件中嵌入变量、逻辑判断、循环、…

    Java 2023年5月18日
    00
  • Spring 4 支持的 Java 8 特性

    Spring 4 支持的 Java 8 特性是在 Spring Framework 4.0 版本中引入的,它充分利用了 Java 8 的新特性,如 Lambda、Stream API、Optional、Date and Time API 等,以提高应用程序的性能和可读性。本文将为您讲解 Spring 4 支持的 Java 8 特性的完整攻略。 支持的新特性 …

    Java 2023年5月31日
    00
  • Java实现顺序表的操作详解

    Java实现顺序表的操作详解 顺序表又称为动态数组,是一种顺序存储的线性结构。在一个一维数组的物理空间中依次存放线性表的各个元素,通常使用分配一段连续的存储空间来存储。本文将详细讲解Java实现顺序表的操作,包括构建、插入、删除、查找等。 初始化顺序表 在Java中,我们使用数组来存储顺序表,因此初始化顺序表即为创建一个数组并分配相应的存储空间。在这里我们先…

    Java 2023年5月26日
    00
  • 深入了解Java定时器中的Timer的原理

    深入了解Java定时器中的Timer的原理攻略 什么是Java定时器 在Java中,我们可以使用定时器来实现周期性和延迟任务。定时器可以根据开发人员设定的时间间隔周期性地触发任务,并且可以延迟执行某个任务。其中,Java Timer则是Java提供的一个定时器工具,能够实现任务的定时执行。 Java Timer的工作原理 Java Timer是基于Java的…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部