springboot2.x整合shiro权限框架的使用

下面我将详细讲解springboot2.x整合shiro权限框架的使用的完整攻略。

一、前置知识

在学习springboot2.x整合shiro权限框架之前,需对以下知识点进行了解:

  1. Spring框架

  2. SpringMVC框架

  3. Maven工具

  4. Shiro框架

二、整合步骤

1.创建Springboot工程

在Maven中新建一个springboot项目,添加web和thymeleaf依赖,并引入shiro依赖。

<dependency>
    <groupId>org.apache.shiro</groupId>
    <artifactId>shiro-spring</artifactId>
    <version>1.7.0</version>
</dependency>

2.配置Shiro

在Springboot中使用Shiro需要对Shiro进行配置,创建ShiroConfig配置类,并使用注解@Configuration和@ImportResource引入shiro.ini文件。

@Configuration
@ImportResource(locations = { "classpath:shiro.ini" })
public class ShiroConfig {

}

3.添加自定义Realm

自定义Realm是Shiro进行权限验证的关键所在,我们需要继承org.apache.shiro.realm.Realm接口并实现其中的方法,进行用户身份认证和用户授权验证。

public class MyRealm implements Realm {

    @Autowired
    private UserService userService;

    @Override
    public String getName() {
        return "MyRealm";
    }

    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof UsernamePasswordToken;
    }

    @Override
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = token.getPrincipal().toString();
        User user = userService.findByName(username);
        if (user == null) {
            throw new UnknownAccountException();
        }
        return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
    }

    @Override
    public AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        User user = userService.findByName(principals.getPrimaryPrincipal().toString());
        info.addRoles(user.getRoleList());
        info.addStringPermissions(user.getPermissionList());
        return info;
    }

}

4.配置SecurityManager

在ShiroConfig配置类中添加SecurityManager,并将自定义Realm添加到SecurityManager中。

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

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

5.配置Shiro的过滤器

对于不同的请求进行不同的权限验证,可以使用Shiro的过滤器。我们可以通过配置ShiroFilterFactoryBean来实现。

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

    Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
    filterChainDefinitionMap.put("/", "anon");
    filterChainDefinitionMap.put("/login", "anon");
    filterChainDefinitionMap.put("/logout", "logout");
    filterChainDefinitionMap.put("/admin/**", "roles[admin]");
    filterChainDefinitionMap.put("/**", "authc");

    factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);

    factoryBean.setLoginUrl("/login");
    factoryBean.setSuccessUrl("/index");
    factoryBean.setUnauthorizedUrl("/unauthorized");

    return factoryBean;
}

6.编写登录页面和授权页面

完成Shiro权限框架的配置之后,我们需要编写登录页面和授权页面,这里使用Thymeleaf模板引擎编写。

登录页面login.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
    <form action="/login" method="post">
        <input type="text" name="username" placeholder="用户名">
        <input type="password" name="password" placeholder="密码">
        <button type="submit">登录</button>
    </form>
</body>
</html>

授权页面index.html:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>授权页面</title>
</head>
<body>
    <h1>欢迎访问授权页面</h1>
</body>
</html>

7.编写Controller

编写登录Controller和授权Controller。

登录Controller:

@Controller
public class LoginController {

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

    @PostMapping("/login")
    public String checkLogin(String username, String password) {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        try {
            subject.login(token);
            return "redirect:/index";
        } catch (Exception e) {
            return "redirect:/login";
        }
    }

    @GetMapping("/logout")
    public String logout() {
        Subject subject = SecurityUtils.getSubject();
        subject.logout();
        return "redirect:/login";
    }

}

授权Controller:

@Controller
public class IndexController {

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

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

}

8.运行程序

完成上述步骤,我们就可以运行程序,输入正确用户名和密码可以访问授权页面,输入错误用户名和密码则跳转到登录页面。

三、示例

下面提供两个示例帮助理解整合过程:

示例一:shiro.ini配置文件

[users]
zhangsan = 123456, user
lisi = 123456, admin

[roles]
admin = *

[urls]
/admin/** = roles[admin]
/** = authc

示例二:自定义Realm

public class MyRealm implements Realm {

    @Autowired
    private UserService userService;

    @Override
    public String getName() {
        return "MyRealm";
    }

    @Override
    public boolean supports(AuthenticationToken token) {
        return token instanceof UsernamePasswordToken;
    }

    @Override
    public AuthenticationInfo getAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        String username = token.getPrincipal().toString();
        User user = userService.findByName(username);
        if (user == null) {
            throw new UnknownAccountException();
        }
        return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
    }

    @Override
    public AuthorizationInfo getAuthorizationInfo(PrincipalCollection principals) {
        SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
        User user = userService.findByName(principals.getPrimaryPrincipal().toString());
        info.addRoles(user.getRoleList());
        info.addStringPermissions(user.getPermissionList());
        return info;
    }

}

以上就是springboot2.x整合shiro权限框架的使用的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springboot2.x整合shiro权限框架的使用 - Python技术站

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

相关文章

  • Java Mybatis框架由浅入深全解析下篇

    Java Mybatis框架由浅入深全解析下篇 本文将由浅入深地解析Java Mybatis框架,讲解Mybatis框架的基本原理、应用场景、核心组件以及使用技巧等内容。 Mybatis框架基本原理 Mybatis框架是一个轻量级的ORM框架,它将Java对象和SQL语句映射成为数据库操作语句。Mybatis框架通过映射文件将Java类和SQL语句进行映射,…

    Java 2023年6月2日
    00
  • 一文给你通俗易懂的讲解Java异常

    接下来我会为您详细讲解如何写出一篇讲解Java异常的通俗易懂的文章。 一、标题的制定 首先,在制定文章标题时,要考虑读者的需求和写作的目的,最好能够让读者很快地了解这篇文章的主旨。因此,我们可以采用“一文给你通俗易懂的讲解Java异常”的形式,直接点明我们的主题,并与读者产生共鸣。 二、在引言中概括Java异常概念 接下来在引言中需要对Java异常相关概念进…

    Java 2023年5月26日
    00
  • springmvc无法访问/WEB-INF/views下的jsp的解决方法

    解决 SpringMVC 无法访问 /WEB-INF/views 下的 JSP 的问题,可以尝试以下步骤: 确认 SpringMVC 配置 首先,需要在 SpringMVC 的配置文件 dispatcher-servlet.xml 中确认以下配置: <!– 配置 InternalResourceViewResolver –> <bean…

    Java 2023年6月15日
    00
  • 数据库其它

    关于“数据库其它”的攻略,我可以向你分享以下内容: 什么是“数据库其他” 在数据库领域中,通常我们在日常工作中会遇到常见的数据库如MySQL、Oracle、SQL Server等,但是还存在一些相对冷门但是非常有用的数据库,这些数据库就是“数据库其他”。这些数据库通常也有独特的使用场景和应用需求,有一定的价值。下面是一些常见的“数据库其他”: MongoDB…

    Java 2023年5月19日
    00
  • Java基于递归和循环两种方式实现未知维度集合的笛卡尔积算法示例

    Java基于递归和循环两种方式实现未知维度集合的笛卡尔积算法示例,主要是针对未知维度的集合进行求解笛卡尔积问题,该问题常见于数学和计算机科学中。通过Java的两种方式实现,即可解决此类问题。 一、递归方式实现笛卡尔积算法示例 针对未知维度的集合进行求解笛卡尔积问题,可以使用递归方式进行实现。实现过程中,需要先求出第一个集合的元素,然后依次将后面的集合元素加入…

    Java 2023年5月19日
    00
  • 详解Java中native方法的使用

    详解Java中native方法的使用 什么是native方法 在Java中,native方法是指使用C、C++等非Java语言实现的方法,通常用于Java程序中需要与底层操作系统或硬件等交互的场景,比如操作系统中调用一些API,访问硬件等。 使用native方法 在Java中使用native方法需要以下步骤: 声明native方法,以告诉编译器该方法的实现不…

    Java 2023年5月26日
    00
  • JDBC实现数据库增删改查功能

    下面是关于JDBC实现数据库增删改查功能的详细攻略。 1. 前置知识 在学习JDBC之前,需要先掌握以下知识: Java基础知识 SQL语言基础知识 数据库基础知识 2. JDBC简介 Java Database Connectivity (JDBC) 是Java语言操作数据库的标准接口,它提供了一组不依赖于特定数据库管理系统的通用API,使得我们能够通过J…

    Java 2023年5月20日
    00
  • Java基础之反射详解

    Java基础之反射详解 简介 反射(Reflection)是Java语言的重要特性之一,可以在运行时获取一个类的构造方法、成员变量、方法等信息。反射使得Java编写的代码具有更强的灵活性和可扩展性。 反射的基本应用 获取Class对象 获取一个类的Class对象,可以使用以下三种方式: 调用类的静态变量class。 使用对象的getClass()方法。 使用…

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