SpringSecurity基于内存的多个登录用户支持

devtools/2024/11/24 6:46:29/

Spring Security 支持各种来源的用户数据,包括内存、数据库、LDAP 等,它们被抽象为一个 UserDetailsService 接口,任何实现了 UserDetailsService 接口的对象都可以作为认证数据源。在这种设计模式下,Spring Security 显得尤为灵活。其中,基于内存的多用户支持的实现方式如下:

配置步骤

  1. 准备资源:创建Controller,并在Controller中建立一些测试路由。
  2. 资源授权的配置:使用 antMatchers() 方法进行 URL 匹配和权限设置。例如,antMatchers("/admin/api/")可以匹配 /admin/api/ 下的所有 API,并指定只有 ADMIN 角色才能访问。同理,/user/api/下的API可以设置为只有 USER 或 ADMIN 角色才能访问,而/app/api/下的API则可以设置为公开权限。
  3. 在配置文件中设置用户名和密码:在 application.properties 或 application.yml 中配置用户名、密码以及角色。
  4. 在 Security 配置类中配置用户存储:通过覆盖 configure(AuthenticationManagerBuilder auth) 方法,并使用 inMemoryAuthentication() 方法来配置基于内存的用户存储。可以使用withUser()方法来创建用户,并设置其密码和角色。

1、单个登录用户

配置单个登录用户,可以在项目的  application.properties 或 application.yml 中配置用户名和密码。

spring:security:user:name: panjunbiao #登录名称password: 123456 #登录密码

2、基于内存的多个登录用户

基于内存的用户存储不需要额外的数据库配置,适用于小型应用或测试环境。无需等待数据库连接或初始化,可以快速启动应用。

2.1 方式一:实现自定义 UserDetailsService 接口

实现自定义一个 UserDetailsService 接口,任何实现了 UserDetailsService 接口的对象都可以作为认证数据源。

/*** 内存中添加登录账号(方式一)*/
@Bean
public UserDetailsService userDetailsService()
{InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withUsername("admin").password("123456").roles("ADMIN").build());manager.createUser(User.withUsername("user").password("123456").roles("USER").build());manager.createUser(User.withUsername("panjunbiao").password("123456").roles("USER").build());return manager;
}/*** 由于5.x版本之后默认启用了委派密码编译器,* 因而按照以往的方式设置内存密码将会读取异常,* 所以需要暂时将密码编码器设置为 NoOpPasswordEncoder*/
@Bean
public PasswordEncoder passwordEncoder()
{return NoOpPasswordEncoder.getInstance();
}

InMemoryUserDetailsManager 是 UserDetailsService 接口中的一个实现类,它将用户数据源寄存在内存里,在一些不需要引入数据库这种重数据源的系统中很有帮助。

2.2 方式二:通过覆盖 configure(AuthenticationManagerBuilder auth) 方法

在 Security 配置类中配置用户存储,通过覆盖 configure(AuthenticationManagerBuilder auth) 方法,并使用 inMemoryAuthentication() 方法来配置基于内存的用户存储。可以使用withUser()方法来创建用户,并设置其密码和角色。

/*** 内存中添加登录账号(方式二)* AuthenticationManagerBuilder 允许配置认证账号*/
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception
{auth.inMemoryAuthentication().withUser("admin").password("123456").roles("ADMIN").and().withUser("user").password("123456").roles("USER").and().withUser("panjunbiao").password("123456").roles("USER");
}/*** 由于5.x版本之后默认启用了委派密码编译器,* 因而按照以往的方式设置内存密码将会读取异常,* 所以需要暂时将密码编码器设置为 NoOpPasswordEncoder*/
@Bean
public PasswordEncoder passwordEncoder()
{return NoOpPasswordEncoder.getInstance();
}

2.3 完整的示例代码

完整的 WebSecurityConfig 类(Spring Security 配置类)的代码。

package com.pjb.securitydemo.config;import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;/*** Spring Security 配置类* @author pan_junbiao**/
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter
{@Overrideprotected void configure(HttpSecurity http) throws Exception{http.authorizeRequests() //返回一个URL拦截注册器.antMatchers("/admin/api/**").hasRole("ADMIN") //设置授权角色.antMatchers("/user/api/**").hasRole("USER") //设置授权角色.antMatchers("/app/api/**","/captcha.jpg").permitAll() //公开其权限.anyRequest() //匹配所有的请求.authenticated() //所有匹配的URL都需要被认证才能访问.and() //结束当前标签,让上下文回到 HttpSecurity.formLogin() //启动表单认证.loginPage("/myLogin.html") //自定义登录页面.loginProcessingUrl("/auth/form") //指定处理登录请求路径.permitAll() //使登录页面不设限访问.and().csrf().disable(); //关闭CSRF的防御功能}/*** 内存中添加登录账号(方式一)*/@Beanpublic UserDetailsService userDetailsService(){InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withUsername("admin").password("123456").roles("ADMIN").build());manager.createUser(User.withUsername("user").password("123456").roles("USER").build());manager.createUser(User.withUsername("panjunbiao").password("123456").roles("USER").build());return manager;}/*** 内存中添加登录账号(方式二)* AuthenticationManagerBuilder 允许配置认证账号*//*@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception{auth.inMemoryAuthentication().withUser("admin").password("123456").roles("ADMIN").and().withUser("user").password("123456").roles("USER").and().withUser("panjunbiao").password("123456").roles("USER");}*//*** 由于5.x版本之后默认启用了委派密码编译器,* 因而按照以往的方式设置内存密码将会读取异常,* 所以需要暂时将密码编码器设置为 NoOpPasswordEncoder*/@Beanpublic PasswordEncoder passwordEncoder(){return NoOpPasswordEncoder.getInstance();}
}


http://www.ppmy.cn/devtools/136482.html

相关文章

Android Activity 基础接口知识和常见问题

Activity 知识点及问题点 接口onMultiWindowModeChangedonConfigurationChanged 常见问题Android解决点击桌面图标,就重新启动应用程序问题 接口 onMultiWindowModeChanged 定义 onMultiWindowModeChanged是Android中Activity类的一个回调方法。它会在活动&#xf…

挂壁式空气净化器什么牌子净化好?测评高热度品牌排行

近年来,挂壁式空气净化器日益成为消费者关注的焦点。随着市场需求的激增,其品牌和型号亦愈发丰富。作为家电测评领域的专业人士,我已评测了众多挂壁式空气净化器,发现部分产品存在质量问题,净化效果不佳,尤…

第二十九章 TCP 客户端 服务器通信 - 记录的拼接

文章目录 第二十九章 TCP 客户端 服务器通信 - 记录的拼接记录的拼接多路复用 TCP设备正在关闭连接使用CLOSE命令断开连接 第二十九章 TCP 客户端 服务器通信 - 记录的拼接 记录的拼接 在某些情况下,TCP会将不同的记录连接在一起形成单个记录。如果客户端或服务器…

HTML5实现剪刀石头布小游戏(附源码)

文章目录 1.设计来源1.1 主界面1.2 皮肤风格1.2 游戏中界面 2.效果和源码源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.net/weixin_43151418/article/details/143798520 HTM…

Linux安装RabbitMQ

安装步骤 rabbitmq使用erlang开发,依赖于erlang,所以需要先下载erlang,且版本要兼容: 可在官网查看erlang与rabbitmq的版本对应关系 https://www.rabbitmq.com/docs/which-erlangCentOs7安装运行 下载 下载地址 https://www.rab…

vue el-table表格点击某行触发事件操作栏点击和row-click冲突问题

文章为本新手菜鸡的问题记录,如有错误和不足还请大佬指正 文章目录 前言一、点击el-table表格某行,触发事件二、解决el-table的操作栏点击和row-click冲突问题1.问题:2.解决方法 前言 文章主要解决两个问题: 1、点击el-table表格…

【SQL Server】华中农业大学空间数据库实验报告 实验四 完整性约束

1.实验目的 通过理论课的学习与实验指导书的帮助,在实验课操作的基础上进一步理解数据库中,实现数据完整性的概念及实施数据完整性的重要性,同时掌握数据完整性的分类,体会数据完整性约束的作用,加深对数据完整性及其…

Selenium 使用指南:从基础到反爬虫的实践

掌握Selenium 文章目录 掌握Selenium复杂动态网页解决方案Selenium简介Selenium chromedriver 安装打开自动化浏览器初始化机器人访问url——browser.get(url)全屏打开网页——browser.maximize_window()关闭窗口——browser.close()指定selenium参数需要的库网页元素定位获取…