Spring Boot在Web应用中基于JdbcRealm安全验证过程

关于Spring Boot在Web应用中基于JdbcRealm安全验证的完整攻略,可以分为以下几个部分:

  1. 依赖配置
    在项目的pom.xml文件中添加Shiro和JDBC驱动的依赖:
<dependencies>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.4.2</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>
</dependencies>
  1. Shiro配置
    Shiro通过Ini配置文件或者编程方式来进行配置,这里我们选择编程方式。实现ShiroConfig类,在里面配置需要的对象,例如Realm、SecurityManager等。具体代码如下:
@Configuration
public class ShiroConfig {

    /**
     * 自定义Realm实现
     */
    @Bean
    public JdbcRealm jdbcRealm() {
        JdbcRealm jdbcRealm = new JdbcRealm();
        jdbcRealm.setDataSource(dataSource());  // 设置数据源
        jdbcRealm.setAuthenticationQuery("SELECT password FROM users WHERE username = ?");  // 查询用户密码
        jdbcRealm.setUserRolesQuery("SELECT r.role_name FROM user_role ur, roles r WHERE ur.user_id = (SELECT id FROM users WHERE username = ?) AND ur.role_id = r.id");  // 查询用户角色
        jdbcRealm.setPermissionsQuery("SELECT p.permission_name FROM roles_permissions rp, permissions p WHERE rp.permission_id = p.id AND rp.role_id = (SELECT id FROM roles WHERE role_name = ?)");  // 查询角色权限
        jdbcRealm.setCredentialsMatcher(hashedCredentialsMatcher());  // 设置密码校验器
        return jdbcRealm;
    }

    /**
     * 配置SecurityManager
     */
    @Bean
    public SecurityManager securityManager() {
        DefaultSecurityManager securityManager = new DefaultSecurityManager();
        securityManager.setRealm(jdbcRealm());
        return securityManager;
    }

    /**
     * 密码校验器
     */
    @Bean
    public HashedCredentialsMatcher hashedCredentialsMatcher() {
        HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
        matcher.setHashAlgorithmName("MD5");  // MD5加密
        matcher.setHashIterations(1);  // 迭代次数
        return matcher;
    }

    /**
     * 数据源配置
     */
    @Bean
    public DataSource dataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/test");
        dataSource.setUsername("root");
        dataSource.setPassword("123456");
        return dataSource;
    }

    /**
     * 配置Shiro过滤器
     */
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean() {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager());
        shiroFilterFactoryBean.setLoginUrl("/login");  // 设置登录页面
        shiroFilterFactoryBean.setSuccessUrl("/index");  // 设置登录成功跳转页面
        shiroFilterFactoryBean.setUnauthorizedUrl("/403");  // 设置未授权页面
        // 配置过滤器链
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/static/**", "anon");  // 静态资源不拦截
        filterChainDefinitionMap.put("/logout", "logout");  // 登出
        filterChainDefinitionMap.put("/login", "anon");  // 登录页面不拦截
        filterChainDefinitionMap.put("/**", "authc");  // 其他页面需要认证
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

}
  1. 编写登录页面
    在登录页面,需要提交用户名和密码,具体代码如下:
<form method="post" action="/login">
    <label>用户名:</label>
    <input type="text" name="username"/>
    <br/>
    <label>密码:</label>
    <input type="password" name="password"/>
    <br/>
    <input type="submit" value="登录"/>
</form>
  1. 编写控制器
    在控制器中,需要实现登录、登出等操作,具体代码如下:
@Controller
public class UserController {

    /**
     * 跳转到登录页面
     */
    @GetMapping("/login")
    public String login() {
        return "login";
    }

    /**
     * 登录
     */
    @PostMapping("/login")
    public String doLogin(String username, String password) {
        // 创建UsernamePasswordToken
        UsernamePasswordToken token = new UsernamePasswordToken(username, password);
        // 获取Subject对象
        Subject subject = SecurityUtils.getSubject();
        try {
            // 进行登录
            subject.login(token);
            return "redirect:/index";
        } catch (AuthenticationException e) {
            // 登录失败
            return "login";
        }
    }

    /**
     * 登出
     */
    @GetMapping("/logout")
    public String logout() {
        // 获取Subject对象
        Subject subject = SecurityUtils.getSubject();
        // 登出
        subject.logout();
        return "redirect:/login";
    }

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

    /**
     * 未授权页面
     */
    @GetMapping("/403")
    public String unauthorized() {
        return "403";
    }

}
  1. 配置示例
    我们可以通过在数据库中添加用户表、角色表、权限表,来实现基于JdbcRealm的安全验证。例如在用户表中添加了一条记录:
INSERT INTO users(id, username, password) VALUES(1, 'test', '098f6bcd4621d373cade4e832627b4f6');

其中密码使用了MD5对123456进行了加密。

我们还可以在角色表中添加一个admin角色,在用户角色表中为test用户添加了admin角色。在权限表中为admin角色添加了一个/test的权限。

这样,在访问/test页面时,需要用户进行登录,才能够访问。如果用户没有admin角色的权限,将会跳转到未授权页面。

通过以上步骤,我们就可以实现基于JdbcRealm的安全验证过程。

示例代码请参考:https://github.com/gaohan0719/shiro-jdbc-demo

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Spring Boot在Web应用中基于JdbcRealm安全验证过程 - Python技术站

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

相关文章

  • 深入了解java.util.Arrays的使用技巧

    深入了解 java.util.Arrays 的使用技巧 java.util.Arrays 类包含了很多用于数组的方法,学会了这些方法,可以大大提高我们的开发效率。本篇攻略将深入了解 java.util.Arrays 的使用技巧。 基本方法 arraysEquals arraysEquals 方法用于比较两个数组是否相等,即数组中的元素是否相等,而不仅是比较数…

    Java 2023年5月26日
    00
  • jsp中page指令用法详解

    下面是 “jsp中page指令用法详解”的完整攻略。 什么是Page指令? Page指令是JSP页面的一个必需元素。它告诉JSP引擎关于JSP页面的特定信息。Page指令以<%@ page %>的格式来表示。 Page指令的属性 Page指令有以下属性: language:指定JSP页面所使用的脚本语言。默认为Java。例如:language=”…

    Java 2023年6月15日
    00
  • Python进阶学习之特殊方法实例详析

    我会为您详细讲解“Python进阶学习之特殊方法实例详析”的完整攻略。 什么是特殊方法 在Python中,特殊方法是以双下划线“__”开头和结尾的方法,也被称为魔术方法,这些方法用于在定义自己的对象时提供特殊的语法支持,例如比较、迭代、属性访问等。 特殊方法实例:__str__方法 __str__方法用于定义对象被打印时的输出内容,对于自定义的类,我们可以根…

    Java 2023年5月26日
    00
  • JDBC下Idea添加mysql-jar包的详细过程

    JDBC是Java语言操作关系型数据库的标准API,目前已经成为了Java中最流行的访问数据库的方式之一,因此在开发Java应用程序时,经常需要使用JDBC操作数据库。 而在使用Idea开发Java应用程序时,需要添加mysql-jar包才能够操作MySQL数据库。以下是JDBC下Idea添加mysql-jar包的详细过程: 下载mysql-jar包 首先,…

    Java 2023年6月16日
    00
  • Spring AOP定义Before增加实战案例详解

    在Spring应用程序中,我们可以使用AOP(面向切面编程)来实现横切关注点的模块化。在本文中,我们将详细介绍如何使用Spring AOP定义Before增强,并提供两个示例说明。 1. Before增强 Before增强是AOP中的一种通知类型,它在目标方法执行之前执行。我们可以使用@Before注解将一个方法标记为Before增强。下面是一个示例代码: …

    Java 2023年5月18日
    00
  • vue之proxyTable代理超全面配置流程

    Vue之proxyTable代理超全面配置流程 概述 Vue.js 是一个构建数据驱动的 web 界面的渐进式框架,使用 Vue 开发前端项目时,经常遇到需要向后端接口发起 HTTP 请求的情况。由于前端和后端常常处于不同的服务器上,因此需要解决跨域的问题。本文将介绍在 Vue 项目中使用 proxyTable 进行接口代理的配置流程。 步骤 步骤一:在we…

    Java 2023年6月15日
    00
  • spring mvc路径匹配原则详解

    Spring MVC 路径匹配原则详解 Spring MVC 是一种基于 Servlet 的 MVC 框架,用于创建 Java Web 应用程序。 在 Spring MVC 中,请求的 URL 将被映射到具体的控制器类和方法,这种映射是通过使用 URL Path Pattern(路径模式)实现的。路径模式指定了请求路径的规则,这些规则用于将请求映射到具体的处…

    Java 2023年5月16日
    00
  • idea2020.3测试评价及感受

    IDEA 2020.3测试评价及感受 概述 IntelliJ IDEA 2020.3是一款集成开发环境,旨在提供给Java、Kotlin等开发者使用。本文将深入探讨该版本的测试评价及感受。 安装及配置 在官方网站(https://www.jetbrains.com/idea/)下载.idea2020.3版本软件,然后按照提示进行安装。如若使用社区版则无需激活…

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