Spring Security实战--(二)数据库实现

Spring Boot + Spring Security通过数据库验证用户身份信息 Spring Security 1.mysql数据库中的准备 1.1 建立数据库 db_authority 1.2 建立表 tb_user 表中字段为:id name password role CREATE TABLE `tb_user` ( `id` bigint(20) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL COMMENT '用户名', `password` varchar(255) DEFAULT NUL 阅读详情

一、数据库的实现

Spring Security提供了默认数据库模板和自定义数据库两种方式,默认数据库方式就不说了,因为基本没人用到

二、自定义数据库

2.1 不同权限controller建立

建立下相关controller,为不同权限做准备

在这里插入图片描述
代码如下,注释已经解释清楚了,就不多说了

@RestController
@RequestMapping("admin/api")
public class AdminController {

    /**
     * 管理员访问路径
     * @return
     */
    @GetMapping("hello")
    public String hello(){
        return "admin,hello";
    }

}

@RestController
@RequestMapping("/user/api")
public class UserController {

    /**
     * 注册用户访问路径
     * @return
     */
    @GetMapping("hello")
    public String hello(){
        return "user,hello";
    }

}

@RestController
@RequestMapping("/app/api")
public class AppController {

    /**
     * 游客访问路径
     * @return
     */
    @GetMapping("hello")
    public String hello(){
        return "app,hello";
    }
}

2.2 不同权限资源授权配置

顺便演示一下内存多用户配置

2.2.1 内存多用户配置

配置访问路径权限和用户组权限

package com.example.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/admin/api/**").hasRole("ADMIN")
                .antMatchers("/user/api/**").hasRole("USER")
                .antMatchers("/app/api/**").permitAll()
                .anyRequest().authenticated()
                .and()
                .formLogin();
    }

    @Bean
    public UserDetailsService userDetailsService(){
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("user").password("{noop}123").roles("USER").build());
        manager.createUser(User.withUsername("admin").password("{noop}123").roles("USER,ADMIN").build());
        return manager;
    }
}

在这里使用InMemoryUserDetailsManager 生成了两个用户,将用户寄存在内存中

直接登录http:localhost:8080/user/api/hello,会跳转到登录页面

在这里插入图片描述
使用user用户登录
在这里插入图片描述
跳转到admin/api/hello
在这里插入图片描述
显示403错误,即认证成功但是权限不够

2.2.2 数据库多用户

Security提供了UserDetailsService实现类,可以利用他实现自定义的数据库查找用户,使用loadUserByUsername来获取用户

因此这里工程需要接入MyBatis

添加相关的配置并建立mysql数据库

CREATE TABLE USERS(
	ID BIGINT(20) PRIMARY KEY NOT NULL AUTO_INCREMENT,
	USERNAME VARCHAR(50) NOT NULL,
	PASSWORD VARCHAR(60),
	ENABLE TINYINT(4) NOT NULL DEFAULT '1' COMMENT '用户是否可用',
	ROLES TEXT CHARACTER SET UTF8 COMMENT '用户角色'
);

INSERT INTO USERS(USERNAME,PASSWORD,ENABLE,ROLES) VALUES("admin","123456","1","ROLE_ADMIN,ROLE_USER");
INSERT INTO USERS(USERNAME,PASSWORD,ENABLE,ROLES) VALUES("user","123456","1","ROLE_USER");

其中,USERS表存用户、密码、是否可用和用户角色(多个角色用逗号分隔)

编写相关的User实体类

实体类需实现UserDetails,UserDetails对象包含了一系列在验证时会用到的信息,包括用户名、密码、权限以及其他信息,SpringSecurity会根据这些信息判断验证是否成功

package com.example.pojo;

import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

import java.util.Collection;
import java.util.List;

public class User implements UserDetails {

    private Long id;
    private String username;
    private String password;
    private String roles;
    private boolean enable;
    private List<GrantedAuthority> authorities;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getRoles() {
        return roles;
    }

    public void setRoles(String roles) {
        this.roles = roles;
    }

    public void setEnable(boolean enable) {
        this.enable = enable;
    }

    public void setAuthorities(List<GrantedAuthority> authorities) {
        this.authorities = authorities;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return this.authorities;
    }

    @Override
    public String getPassword() {
        return this.password;
    }

    @Override
    public String getUsername() {
        return this.username;
    }

    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    @Override
    public boolean isEnabled() {
        return this.enable;
    }
}

POJO实现了UserDetails,其中的一些方法,比如:isAccountNonLocked、isAccountNonLocked和isCredentialsNonExpired这里暂时没用到,统一返回为true,否则会被SpringSecurity认为是账号异常

UserDetailService的实现

UserDetailService定义了一个loadUserByUsername方法,用于获取UserDetails对象

package com.example.service;

import com.example.mapper.UserMapper;
import com.example.pojo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;

@Service
public class MyUserDetailService implements UserDetailsService {

    @Autowired
    private UserMapper userMapper;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //从数据库读取
        User user = userMapper.findByUserName(username);
        if(null == user){
            throw new UsernameNotFoundException("用户不存在");
        }
        //将roles解析为UserDetails的权限集
        user.setAuthorities(generateAuthorities(user.getRoles()));
        return user;
    }

    private List<GrantedAuthority> generateAuthorities(String roles){
        List<GrantedAuthority> authorities= new ArrayList<>();
        String[] roleArrays = roles.split(",");
        if(roles != null && !"".equals(roles)){
            for (String role : roleArrays) {
                authorities.add(new SimpleGrantedAuthority(role));
            }
        }
        return authorities;
    }
}

因为SpringSecurity使用的是5.x.x版本,对应的SpringSecurity对明文密码设置有要求,否则会报空指针异常
在这里插入图片描述
PasswordEncoder配置

这里对PasswordEncoder做自定义类,做明文密码匹配

@Service
public class MyPasswordEncoder implements PasswordEncoder {

    @Override
    public String encode(CharSequence charSequence) {
        return charSequence.toString();
    }

    @Override
    public boolean matches(CharSequence charSequence, String s) {
        return s.equals(charSequence.toString());
    }
}

Security配置类

在WebSecurityConfig配置类中进行配置添加,使用自定义的UserDetailService和PasswordEncoder如下:

@Autowired
private MyUserDetailService myUserDetailService;

@Autowired
private MyPasswordEncoder myPasswordEncoder;

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(myUserDetailService).passwordEncoder(myPasswordEncoder);
}

Mapper配置

这里只用配置一个接口就行了,数据库的连接配置就不放出来了

package com.example.mapper;

import com.example.pojo.User;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Component;

@Component
public interface UserMapper {

    @Select("SELECT * FROM USERS WHERE USERNAME = #{username}")
    User findByUserName(@Param("username") String  username);
}

三、页面验证

输入http://localhost:8080/user/api/hello,会自动跳转到登录界面
在这里插入图片描述
输入用户user,密码123456
在这里插入图片描述
输入http://localhost:8080/admin/api/hello
在这里插入图片描述
显示权限不够,改用admin账户登录;建立使用无痕模式测试,以免浏览器缓存导致奇奇怪怪的问题

在这里插入图片描述
再登入http://localhost:8080/user/api/hello
在这里插入图片描述
admin和user路径都可以访问

以上就是数据库实现Spring Security的自定义访问

SpringSecurity连接数据库并设置权限 在页面显示权限是否正确。 阅读详情

相关推荐

Spring Security介绍

文章主要分三部分 1、Spring Security的架构及核心组件:(1)认证;(2)权限拦截;(3)数据库管理;(4)权限缓存;(5)自定义决策; 2、环境搭建与使用,使用当前热门的Spring Boot来搭建环境,结合项目中实际的例子来做几个Case; 3、Spring Security的优缺点总结,结合第二部分中几个Case的实现来总结Spring Security的优点和缺点。 1、Spring Security介绍 ​ 整体介绍,Spring Security为基于J2EE开发的企业应用软件

li123128的博客 2万+

SpringSecurity连接数据库的使用

一、简介 Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案。正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”(或者访问控制),一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权(Authorization)两个部分,这两点也是 Spring Security 重要核心功能。 (1)用户

qq_44796093的博客 5292

Spring Security连接数据库实现登录

使用Spring Security的登录页面,从数据库中获取数据进行登录认证。 步骤: 一、前置工作: 1.搭建Spring Boot 2.连接MySQL数据库,数据库中创建好表 二、 Spring Security环节 创建与数据库对应的admin实体(Admin.java) 写查询语句(AdminDao.java和AdminDao.xml) 实现UserDetailsService接口(Us...

weixin_45963819的博客 5690

Spring Security之自定义数据库表

[org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl]类中定义了三条sql语句和三个相关的方法:public static final String DEF_USERS_BY_USERNAME_QUERY = "select username,password,enabled " + "from use

来啊 快活啊 1568

spring-boot:使用spring security实现用户登录注册(一)

项目地址:https://github.com/lizhibin205/simple_web_v2 一、数据库表 CREATE TABLE `users` ( `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '用户ID', `name` varchar(45) COLLATE utf8mb4_unicode_ci ...

zhibin的程序日记 9148

vue + spring boot 个人网盘项目实战(二):spring security实现remember me

本篇目录remember me 原理spring security实现remember me 功能遇到的问题前台页面实现效果展示 remember me 原理 spring security实现remember me 功能 遇到的问题 关于Could not autowire. There is more than one bean of ‘DataSource’ type.Beans:dataSource的解决办法 前台页面 实现效果展示 ...

Autumnoo的博客 1357

Spring Security系列二 用户登录认证数据库实现

我们来把用户的登录认证修改成贴近实际的数据库获取。

m0_59448100的博客 395

spring security原理和机制 | Spring Boot 35

一、SpringSecurity 框架简介 Spring 是非常流行和成功的 Java 应用开发框架,Spring Security 正是 Spring 家族中的 成员。Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方 案。 正如你可能知道的关于安全方面的两个主要区域是“认证”和“授权”(或者访问控 制),一般来说,Web 应用的安全性包括用户认证(Authentication)和用户授权 (Authorization)两个部分,这两点也是 Spring

学Java,找哪吒 5万+

spring security 基于数据库用户认证

配合前面几篇文章一起看 Spring Security 认证 OAuth2 SpringBoot +oAuth2+JWT+Spring Security认证配置 我们了解了使用Spring Security进行认证授权的过程,目前各大网站的认证方式非常丰富:账号密码认证、手机验证码认证、扫码登录等。 连接用户中心数据库进行认证 基于的认证流程在研究Spring Security过程中已经测试通过,到目前为止用户认证流程如下: 认证所需要的用户信息存储在用户中心数据库,现在需要将认证服务连接数据库查询用户信

qq_41860765的博客 1265

SPM12最新安装教程:Matlab2021a用户必看的路径配置技巧

本文为Matlab2021a用户提供SPM12的深度安装与路径配置指南。针对新版Matlab的路径管理变化,详细解析了传统方法失效的原因,并推荐通过创建startup.m文件实现SPM12路径的永久化、自动化配置,确保神经影像分析环境的稳定与高效。

weixin_29061509的博客 315

当版图同学只给GDS文件时,我是这样用Calibre PEX和Cadence做后仿真的(保姆级避坑)

本文详细介绍了在模拟IC设计中,当仅获得GDS文件时,如何利用Calibre PEX和Cadence进行高效后仿真的完整流程。涵盖从寄生参数提取到Spectre模型创建的实战技巧,特别针对版本兼容性、文件独立性和参数可调性等常见问题提供解决方案,帮助工程师规避协作中的典型陷阱。

weixin_42556197的博客 243

最新Spring Security实战教程(六)基于数据库的ABAC属性权限模型实战开发

今天博主又抽空来给小伙伴更新教程啦,上个章节中我们讲解了如何通过数据库实现基于数据库的动态用户认证,大家可能发现了,项目中是基于RBAC角色模型的权限控制,虽然能满足大多数场景,但在面对复杂、细粒度的权限需求时可能会力不从心。基于属性的访问控制(ABAC)模型则通过评估用户、资源、环境等多种属性,实现更加灵活的权限控制。例如,某个菜单的访问可能不仅取决于用户角色,还取决于用户的部门、时间或其他属性。因此,需要在权限验证时动态获取这些属性,并进行评估。那么本章节我们就来讲解基于数据库的ABAC属性权限模型。

Micro麦可乐的博客 6919

MuJoCo 机械臂关节空间阻抗控制Impedance实现(附代码)

阻抗控制通过调整关节的刚度和阻尼,让机器人在接触时产生顺应性,减少冲击力,其核心目标是在接触外部载荷时能够自适应调整输出力矩,实现力与位置的协同控制。阻抗控制可以很快的到达设定位置,在此基础上,使用mujoco交互中的施加外力操作,可以看到当外力松开后,机械臂也可以很快的回弹回设定位置。其中self.Kp和self.Kd为固定刚度和阻尼系数,通过修改刚度和阻尼参数,可以变得更柔顺来应对各种场景。注释掉该行后,直接simulate仿真可以看到机械臂控制位置震荡等情况,接下来引入关节空间阻抗控制的代码。

darcsdn 1274

最新Spring Security实战教程(五)基于数据库的动态用户认证传统RBAC角色模型实战开发

在上一章节中,我们讲解了基于内存的用户认证,也提到了实际开发生产中,更多使用的还是基于数据库的动态用户认证 ,因为在企业应用中,用户、角色、权限管理通常都存储在数据库中。本章节博主带着大家以MySQL数据库为例,从用户(sys_user)、角色(sys_role)用户角色()表出发,演示如何使用动态加载用户信息、角色,实现基于数据库的认证在确保数据库能正常链接后,接下来就跟着博主一起编写我们的业务代码吧自定义继承,重写方法,注入UserMapper通过用户名查询数据库数据,同时将用户的角色集合一并赋值;

Micro麦可乐的博客 7687

lenovo联想拯救者Legion Y9000P 2022款2023款2024款笔记本电脑(82RF,82WK,82WQ,83DE,83DF)原装出厂Windows11预装OEM系统镜像下载

联想原装出厂系统自带所有驱动、出厂主题壁纸、系统属性联机支持标志、系统属性专属LOGO标志、Office办公软件、联想电脑管家、联想浏览器、联想软件商店、legionzone控制中心等预装程序。链接:https://pan.baidu.com/s/1YBji_oh7xOkq-NxnS8Mm8g?链接:https://pan.baidu.com/s/1S7_enXmuoja1a9ASvUT5Fg?拯救者Legion Y9000P IRX9H 2024款【83DE】原厂Win11系统包。

QQ17855069的博客 6528

【YOLOv11改进- 主干网络】YOLOv11+RepViT: 从ViT的角度重新审视Mobile的CNN助力YOLOv11有效涨点;

本文给大家带来的改进内容是在YOLOv11中更换主干网络为RepViT,助力YOLOv11有效涨点,论文通过集成轻量级 ViT 的高效架构设计,逐步增强了标准轻量级 CNN(即 MobileNetV3)的移动友好性。这最终产生了一个新的纯轻量级 CNN 系列的主干网络。

qq_41304809的博客 786

Spring Security实现OAuth2协议及实战

OAuth2是目前最流行的授权协议,用来授权第三方应用,获取用户数据。举个例子:快递员想要进入小区,有3种方式。1是业主远程开门,2是业主告诉门禁密码,3是使用令牌(Oauth2)。如图:令牌和密码的区别:令牌相当于火车票,密码相当于是钥匙。令牌是短期的,自动失效。密码是长期有效。令牌是可以撤销的,撤销立即生效。密码一般不允许他们撤销。令牌有权限范围,如车票座位为10车A15座。密码一般是完整权限。第三方登录演示(网易云客户端利用QQ扫码登录)

qq_43372633的博客 3005

【基于 CasADi 的欠驱动无人船实时非线性模型预测控制(NMPC)实现 Visual Studio 2022 C++】

本文介绍了基于CasADi和IPOPT在Visual Studio 2022 C++环境下实现的欠驱动无人船实时非线性模型预测控制(NMPC)方案。文章详细阐述了NMPC基本原理、欠驱动无人船动力学模型(包含状态变量和控制变量定义),并给出了C++实现的核心代码框架。该方案通过显式引入系统动力学模型和约束条件,在每个采样周期滚动优化控制序列,有效解决了欠驱动无人船的轨迹跟踪与避碰问题。文中还提供了VS2022配置CasADi环境的详细步骤,包括预编译包下载、工程属性设置等关键环节,为工程实现提供了完整的技术

vor234的博客 653

Spring Security基于DB的权限认证

前言 公众号 《java编程手记》记录JAVA学习日常,分享学习路上点点滴滴,从入门到放弃,欢迎关注 前面我们已经将一个简单的Spring Security Demo项目跑起来了,但是使用的是Spring Security自带默认的user用户名以及默认自动生成的密码,本文主要在原有的基础上加入更加适合生产环境使用的基于DB的权限认证,整体实现主要分为两个部分 基于DB的权限表设计 Spring Security认证扩展点实现 基于DB的权限表设计 RBAC介绍 RBAC是基于角色的访问控制(Rol

weixin_43593829的博客 423

信号处理算法:自适应滤波_(8).自适应陷波器

自适应陷波器是一种强大的工具,广泛应用于电力系统、通信系统和生物医学信号处理等领域。通过自适应调整滤波器的参数,自适应陷波器可以在特定频率处形成陷波,从而有效地抑制噪声或干扰信号。常见的自适应算法包括LMS和RLS,它们各有优缺点,可以根据实际需求选择合适的算法。

2401_87715305的博客 1371

基于 ESP32 与 TDS 传感器的水培营养液离子浓度自动配比系统设计与实现

本系统以 ESP32 为主控芯片,结合 TDS(总溶解固体)传感器实时监测水培营养液中的离子浓度,通过蠕动泵自动补充浓缩营养液或清水,实现营养液 EC 值的闭环自动配比。系统适用于家庭及小型农场的水培种植场景,可稳定维持营养液浓度在作物生长所需的最佳区间。

weixin_42300449的博客 81

探 Spring Security 之 用戶帳號資料儲存於DB

前言承襲 {初探 Spring Security 文章},使用 InMemoryUserDetailsManager,建立帳號與密碼並儲存於記憶體中。現實中,我們不會將帳號與密碼這們做,一般情況下,都會存放在資料庫,或者LDAP。以下我們將改寫使用 MySQL 來管理我們的使用者帳戶。專案實作(本次代碼有點多,請細看)1. 新增 pom.xml 相關 Dependencies 2.增修相關代碼修改 Web 安全性, 網路安全配置類別 WebSecurityConfig(使用 HTTP Basic Au

2301_78959703的博客 1604

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Spring Security实战

通过配置实现了以下功能,结合 JWT 认证和无状态会话管理,实现基于令牌的认证方式。表单登录:通过 POST 请求到进行用户认证,认证成功或失败后有自定义的处理器。权限管理配置了权限控制,通过来决定哪些资源需要认证,哪些可以开放。默认所有请求都允许访问(),这通常用于公开 API,或者作为开发阶段的配置。异常处理:对认证失败或权限不足的请求提供定制化的错误处理。无状态会话管理:使用,让系统无状态运行,适用于 JWT 或其他令牌机制。JWT 过滤器。

知五年三的博客 1226

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Spring Security 动态权限实现方案

最近在做 TienChin 项目,用的是 RuoYi-Vue 脚手架,在这个脚手架中,访问某个接口需要什么权限,这个是在代码中硬编码的,具体怎么实现的,松哥下篇文章来和大家分析,有的小伙伴可能希望能让这个东西像 vhr 一样,可以在数据库中动态配置,因此这篇文章和小伙伴们简单介绍下 Spring Security 中的动态权限方案,以便于小伙伴们更好的理解 TienChin 项目中的权限方案。通过代码来配置 URL 拦截规则和请求 URL 所需要的权限,这样就比较死板,如果想要调整访问某一个 URL 所需要

JavaShark的博客 3532

Spring Security快速入门

目录1 Spring Security介绍2 创建工程2.1 创建maven工程2.2 Spring容器配置2.3 Servlet Context配置2.4 加载 Spring容器3 认证3.1 认证页面3.2.安全配置3.2.Spring Security初始化2.3.默认根路径请求2.4.认证成功页面2.5 测试4 授权5 小结 1 Spring Security介绍 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架。由于它是Sprin

赵广陆 1万+
上一篇: Spring Security实战--(一)简单Security应用
下一篇: Spring Security实战--(三)图形验证实现
Double____C
博客等级 码龄8年 92粉丝 79原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值