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日

相关文章

  • Java文件读写详解

    Java文件读写是Java中常见的操作之一,在Java中读写文件过程需要经过三个步骤:打开文件、读取或写入文件、关闭文件。本文将详细介绍Java文件读写的所有操作及示例。 打开文件 在Java程序中打开文件需要使用Java IO类库。其中FileInputStream和FileOutputStream是Java IO中最常用的两个类。下面分别介绍这两个类在打…

    Java 2023年5月20日
    00
  • 多模字符串匹配算法原理及Java实现代码

    多模字符串匹配算法原理及Java实现代码攻略 多模字符串匹配算法是在一个文本串中同时匹配多个模式串的算法。常见的多模匹配算法有Trie树、AC自动机等,本文介绍的是KMP算法。 KMP算法原理 KMP算法的核心思想是利用已知信息,避免不必要的匹配。即:对于模式串中的每一个位置,找到该位置之前的子串的最长公共前后缀,并记录在next[]数组中。当匹配过程中发生…

    Java 2023年5月19日
    00
  • Java实现简易购物系统

    Java实现简易购物系统完整攻略 系统概述 Java实现简易购物系统是一个基于Java编程语言的开源系统,可以帮助商家搭建自己的网上商城平台。该系统依据用户需求,设计了多种功能模块,包括商品展示、购物车管理、地址管理、订单管理等。用户可以在界面友好的页面上完成商品浏览和购买流程,并通过本系统管理个人信息和完成订单等操作。 准备工作 为了更好的完成该系统,需要…

    Java 2023年5月18日
    00
  • MyEclipse+Tomcat配置详解(图文)

    首先,需要说明的是,配置MyEclipse和Tomcat的过程并不是一成不变的,不同版本的软件可能会有些许差别。但是,总体上来说,配置过程都是大同小异的。接下来,我将根据网站上的“MyEclipse+Tomcat配置详解(图文)”文章,为大家详细讲解配置过程。 步骤一:下载MyEclipse和Tomact 要配置MyEclipse和Tomcat,自然需要先下…

    Java 2023年5月19日
    00
  • 一文掌握SpringSecurity BCrypt密码加密和解密

    一文掌握SpringSecurity BCrypt密码加密和解密 为什么要使用BCrypt密码加密 在Web应用程序中,加密用户的密码是一项基本且必不可少的安全措施。BCrypt是一种强大的哈希函数,用于存储用户密码的安全哈希,在SpringSecurity中广泛使用。 相比MD5和SHA-1哈希算法,BCrypt有很多优势: 反向破解BCrypt密码Has…

    Java 2023年6月3日
    00
  • Java数组与字符串深入探索使用方法

    Java数组与字符串深入探索使用方法 一、数组 1. 定义 Java数组是一个可以容纳固定数量元素的容器,它可以被认为是一个有序的元素列表。数组中的每个元素都有唯一的索引号来标识它们在数组中的位置。数组可以是任何类型,包括基本类型和引用类型。 2. 声明 在Java中,声明一个数组需要指定如下信息:- 数组的类型:数组中元素的类型(int、double、St…

    Java 2023年5月26日
    00
  • 10个微妙的Java编码最佳实践

    下面是“10个微妙的Java编码最佳实践”的详细攻略: 1. 始终使用@Override注解 Java 5 中引入了 @Override 注解,该注解用于表示方法重写。虽然在使用时并不是必须的,但如果我们在重写一个方法时没有添加 @Override 注解,极有可能出现意想不到的错误,比如拼写错误或参数数量不足等。因此,我们应该始终在重写方法时添加 @Over…

    Java 2023年5月19日
    00
  • Java中的集合框架是什么?

    Java中的集合框架是一个内置的数据结构库,它提供了一组接口和类,用于处理和管理元素的类集合。Java集合框架有助于开发人员以更高效、更灵活和更可扩展的方式处理复杂数据。 Java集合框架中的类和接口被组织成三个主要的继承层次结构:Collection、Map 和 Iterator。其中,Collection是表示一组对象的根接口,Map是表示一组键值对(k…

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