启用springboot security后登录web页面需要用户名和密码如何解决

发布时间:2023-02-25 10:48:59 作者:iii
来源:亿速云 阅读:303

启用Spring Boot Security后登录Web页面需要用户名和密码如何解决

在使用Spring Boot开发Web应用时,Spring Security是一个非常强大的安全框架,它可以帮助我们轻松地实现身份验证、授权、防止跨站请求伪造(CSRF)等安全功能。然而,当我们启用Spring Security后,访问Web页面时可能会遇到需要输入用户名和密码的情况。本文将详细介绍如何解决这一问题,并提供一些常见的配置选项。

1. 问题描述

当我们启用Spring Security后,默认情况下,Spring Security会为所有请求启用基本身份验证(Basic Authentication)。这意味着,当我们访问任何Web页面时,浏览器会弹出一个登录对话框,要求输入用户名和密码。如果我们没有配置任何用户或密码,Spring Security会使用默认的用户名user和一个随机生成的密码。

2. 默认配置

在Spring Boot中,Spring Security的默认配置如下:

这个默认配置对于开发和测试环境可能已经足够,但在生产环境中,我们通常需要自定义这些配置。

3. 解决方法

3.1 禁用Spring Security

如果我们不需要任何安全功能,可以通过在application.propertiesapplication.yml中禁用Spring Security来解决问题:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration

或者在application.yml中:

spring:
  autoconfigure:
    exclude: org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration

这样,Spring Security将不会被自动配置,Web页面将不再需要用户名和密码。

3.2 配置自定义用户

如果我们希望保留Spring Security的安全功能,但不想使用默认的用户名和密码,可以通过配置自定义用户来解决这个问题。

3.2.1 使用application.propertiesapplication.yml配置

application.properties中,我们可以配置自定义的用户名和密码:

spring.security.user.name=myuser
spring.security.user.password=mypassword

或者在application.yml中:

spring:
  security:
    user:
      name: myuser
      password: mypassword

这样,当我们访问Web页面时,可以使用myusermypassword进行登录。

3.2.2 使用Java配置

我们也可以通过Java代码来配置自定义用户。首先,创建一个配置类,继承WebSecurityConfigurerAdapter,并重写configure方法:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .and()
            .httpBasic();
    }

    @Bean
    @Override
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
            .username("myuser")
            .password("mypassword")
            .roles("USER")
            .build();
        return new InMemoryUserDetailsManager(user);
    }
}

在这个配置类中,我们定义了一个用户myuser,密码为mypassword,并为其分配了USER角色。

3.3 配置免认证的路径

如果我们希望某些路径不需要身份验证,可以通过配置HttpSecurity来实现。例如,我们希望/public/**路径下的所有请求都不需要身份验证:

@Override
protected void configure(HttpSecurity http) throws Exception {
    http
        .authorizeRequests()
            .antMatchers("/public/**").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .and()
        .httpBasic();
}

这样,访问/public/**路径下的资源时,将不再需要输入用户名和密码。

3.4 使用数据库存储用户信息

在生产环境中,我们通常不会将用户信息硬编码在代码中,而是将其存储在数据库中。Spring Security支持从数据库中加载用户信息。

首先,我们需要创建一个用户表,并插入一些用户数据。然后,配置Spring Security使用数据库中的用户信息。

3.4.1 创建用户表

假设我们使用MySQL数据库,创建一个用户表:

CREATE TABLE users (
    username VARCHAR(50) NOT NULL PRIMARY KEY,
    password VARCHAR(100) NOT NULL,
    enabled BOOLEAN NOT NULL
);

CREATE TABLE authorities (
    username VARCHAR(50) NOT NULL,
    authority VARCHAR(50) NOT NULL,
    FOREIGN KEY (username) REFERENCES users(username)
);

INSERT INTO users (username, password, enabled) VALUES ('myuser', 'mypassword', true);
INSERT INTO authorities (username, authority) VALUES ('myuser', 'ROLE_USER');

3.4.2 配置Spring Security使用数据库

在Spring Boot中,我们可以通过配置DataSourceJdbcUserDetailsManager来使用数据库中的用户信息:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.UserDetailsService;
import org.springframework.security.provisioning.JdbcUserDetailsManager;

import javax.sql.DataSource;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private DataSource dataSource;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .and()
            .httpBasic();
    }

    @Bean
    @Override
    public UserDetailsService userDetailsService() {
        return new JdbcUserDetailsManager(dataSource);
    }
}

在这个配置中,我们使用JdbcUserDetailsManager从数据库中加载用户信息。

4. 总结

启用Spring Security后,访问Web页面需要用户名和密码是Spring Security的默认行为。我们可以通过禁用Spring Security、配置自定义用户、配置免认证的路径或使用数据库存储用户信息来解决这个问题。根据实际需求选择合适的解决方案,可以确保我们的Web应用既安全又易于使用。

希望本文能帮助你解决在使用Spring Security时遇到的问题。如果你有任何疑问或建议,欢迎在评论区留言讨论。

推荐阅读:
  1. springboot中怎么利用vue实现sso单点登录
  2. SpringBoot自定义Shiro过滤器无法使用@Autowired怎么办

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot security web

上一篇:Go语言Zap日志库如何使用

下一篇:Pytorch怎么统计参数网络参数数量

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》