惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
WordPress大学
WordPress大学
Apple Machine Learning Research
Apple Machine Learning Research
小众软件
小众软件
雷峰网
雷峰网
博客园 - 聂微东
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 三生石上(FineUI控件)
博客园_首页
博客园 - 司徒正美
博客园 - 叶小钗
IT之家
IT之家
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
博客园 - 【当耐特】
宝玉的分享
宝玉的分享
有赞技术团队
有赞技术团队
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
T
Tailwind CSS Blog
V
V2EX
The Cloudflare Blog

博客园 - 试试手气

Web Worker 入门 若依Ruoyi分离版替换 MyBatis-Plus 若依前端菜单管理中路由地址、组件路径、权限字符的使用 Idea clone 项目推送到自有仓库 Spring Boot —— 集成文档工具 Spring Boot —— Filter 过滤器 Spring Boot —— Cors 跨域 Spring Boot —— 集成 Druid Spring Boot —— 集成 MyBatis-Plus Spring Boot —— 集成 Springdoc Navicat 使用笔记 Datagrip连接SQLServer失败 Asp.net mvc 笔记 Asp.net Core 笔记 mybatis 笔记 SQLServer 笔记 Asp.net Core 全局异常处理 SqlSugar 实践笔记 Asp.net Core 基于Cookie的身份认证
Spring Boot —— Spring Security
试试手气 · 2024-05-22 · via 博客园 - 试试手气

引入依赖

Spring boot 版本 2.7.6

<properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.7.6</spring-boot.version>
        <mysql.version>8.2.0</mysql.version>
        <druid.version>1.2.22</druid.version>
    </properties>
	
<dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-dependencies</artifactId>
                <version>${spring-boot.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
	
	<dependencies>
		<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
	</dependencies>

Spring Security 开始工作了吗

引入Spring Security之后,默认会保(拦)护(截)所有请求,此时使用浏览器访问任意请求(地址)会发现跳转到一个登录页,说明 Spring Security 已经开始工作了,以 Spring Security 5.7.5 为例
image

如果我们什么都不配置,默认的用户名是user,而密码会在启动时输出到控制台Using generated security password: 8c189297-d9c5-483a-9ae2-8efb64129776

配置

自定义用户名和密码

修改配置文件,使用自定义用户名和密码

spring:
  security:
    user:
	  name: admin
	  password: 123456

使用配置类控制 Spring Security 行为

写一个SecurityConfig类,里边定义对 Spring Security 行为的控制,例如

@Configuration
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {

        http.authorizeHttpRequests((auth)->{
            try {
                auth.anyRequest().authenticated()
                        .and()
						// 使用表单登录
                        .formLogin()
                        // 登录成功跳转地址,第二个参数控制是否忽略来源页面始终跳转所设置的地址
                        .defaultSuccessUrl("/authentication")
                        .and()
                        .csrf().disable();
            }catch (Exception e){
                throw new RuntimeException(e);
            }
        });

        return http.build();
    }
}

这是一个非常基础的配置类,启用表单登录并且使用Spring Security默认登录页面(因为没有设置自定义登录页),登录成功默认跳转/authentication。很多书上对此部分的介绍是使SecurityConfig继承WebSecurityConfigurerAdapter,并通过重写configure(AuthenticationManagerBuilder builder)configure(HttpSecurity http)方法达到更多控制

自定义登录页面

如果使用自定义登录页面,通常页面中的用户名或密码会这样写

<input name="username" />
<input name="password" />

如果希望修改表示用户名和密码的关键字,可以通过设置HttpSecurity对应方法,同时修改input的name属性达到目的

.formLogin()
.usernameParameter("uid")
.passwordParameter("pwd")
<input name="uid" />
<input name="pwd" />

基于内存的认证

模拟内存中添加若干用户,这些用户被设置用户名、密码和角色,并在登录时起作用

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter{
	@Override
	protected void configure(AuthenticationManagerBuilder builder) throws Exception{
		builder.inMemoryAuthentication()
			.withUser("admin").password("123456").roles("ADMIN")
			.and()
			.withUser("user").password("123456").roles("USER")
	}
}

注销

默认访问/logout会注销,和登录类似,注销也可以进行针对性设置