启用springboot security后登录web页面需要用户名和密码的解决方法

下面是启用Spring Boot Security后登录Web页面需要用户名和密码的解决方法的完整攻略,包括以下步骤:

1. 添加Spring Boot Security依赖

pom.xml文件中添加Spring Boot Security依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

2. 配置Spring Boot Security

application.properties文件中添加以下配置:

#开启security
security.enabled=true
#配置用户信息来源
security.user.name=admin
security.user.password=admin

3. 创建登录页面

/src/main/resources/templates目录下创建login.html文件,如下所示:

<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org">
<head>
    <title>Login Page</title>
</head>
<body>
    <h1>Login Page</h1>
    <form th:action="@{/login}" method="post">
        <div>
            <label>Username:</label>
            <input type="text" name="username" />
        </div>
        <div>
            <label>Password:</label>
            <input type="password" name="password" />
        </div>
        <button type="submit">Log in</button>
    </form>
</body>
</html>

4. 创建Web安全配置

在项目中创建一个类,并使用@Configuration@EnableWebSecurity注解来声明配置类,并通过继承WebSecurityConfigurerAdapter来将配置应用到Spring Boot Security中。在配置类中,还需要使用@EnableGlobalMethodSecurity(prePostEnabled = true)注解启用方法级别的安全性。

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/css/**", "/js/**").permitAll()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

在上面的配置中,我们配置的是HttpSecurity对象的基本安全性和表单登录,其中:

  • authorizeRequests方法表示匹配器,表示哪些请求需要被拦截,哪些请求放行,其中.antMatchers("/login").permitAll()表示允许访问登录页面。
  • formLogin方法表示表单登录相关的配置,包括登录页面的URL和登录成功后跳转的URL。
  • logout方法表示退出登录的功能。

5. 创建自定义UserDetailsService

创建一个继承了UserDetailsService的类,用于实现从数据库中获取用户信息。

@Service
public class CustomUserDetailsService implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        return new org.springframework.security.core.userdetails.User(user.getUsername(),
                user.getPassword(), Collections.emptyList());
    }
}

在上述代码中,我们使用了userRepository来获取用户信息,并实现了loadUserByUsername方法来获取用户信息。

6. 创建数据库表和实体类

创建数据库表用于存储用户信息,包括用户名、密码等,并创建对应的实体类。这个部分根据具体的数据库和框架来定制,这里不再赘述。

示例说明

示例1: 自定义登录页面模板

可以根据自己的业务需求自定义登录页面模板,这里提供一个模板作为参考:

<!DOCTYPE html>
<html xmlns:th="https://www.thymeleaf.org">
<head>
    <title>Login Page</title>
</head>
<body>
    <h1>Login Page</h1>
    <form class="form-signin" th:action="@{/login}" method="post">
        <h2 class="form-signin-heading">Please sign in</h2>
        <input type="text" class="form-control" name="username" placeholder="Username" required="true" autofocus="true"/>
        <input type="password" class="form-control" name="password" placeholder="Password" required="true"/>
        <div th:if="${param.error}">
          <div class="alert alert-danger alert-dismissible fade show mt-1" role="alert">
            Invalid username and password.
            <button type="button" class="close" data-dismiss="alert" aria-label="Close">
              <span aria-hidden="true">&times;</span>
            </button>
          </div>
        </div>
        <button class="btn btn-lg btn-primary btn-block" type="submit">Log in</button>
    </form>
</body>
</html>

示例2:增加角色权限控制

如果我们需要控制某些页面或操作只能被特定的用户或角色访问或执行,可以做如下配置:

在配置文件中增加角色信息:

security.user.role=ROLE_ADMIN

修改WebSecurityConfig并增加Role判断:

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    private UserDetailsService userDetailsService;

    @Value("${security.user.role}")
    private String role;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/css/**", "/js/**").permitAll()
                .antMatchers("/login").permitAll()
                .antMatchers("/admin/**").hasRole(role)
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

在上面的配置中,我们添加了.antMatchers("/admin/**").hasRole(role)表示所有以/admin开头的路径只能被ROLE_ADMIN角色访问。

此时,我们需要在CustomUserDetailsService中实现UserDetails接口的getAuthorities()方法用于返回用户的权限角色信息,如下所示:

@Service
public class CustomUserDetailsService implements UserDetailsService {
    @Autowired
    private UserRepository userRepository;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        Set<GrantedAuthority> authorities = new HashSet<>();
        authorities.add(new SimpleGrantedAuthority(user.getRole()));
        return new org.springframework.security.core.userdetails.User(user.getUsername(),
                user.getPassword(), authorities);
    }
}

在上面的代码中,我们在返回UserDetails对象时,添加了用户角色信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:启用springboot security后登录web页面需要用户名和密码的解决方法 - Python技术站

(0)
上一篇 2023年6月3日
下一篇 2023年6月3日

相关文章

  • SpringMVC的工程搭建步骤实现

    以下是关于“SpringMVC的工程搭建步骤实现”的完整攻略,其中包含两个示例。 SpringMVC的工程搭建步骤实现 SpringMVC是一种基于Java的Web框架,它可以帮助我们快速开发Web应用程序。在本文中,我们将讲解如何搭建一个SpringMVC工程。 步骤一:创建Maven项目 打开IntJ IDEA,选择“Create New Project…

    Java 2023年5月17日
    00
  • 虚引用的作用是什么?

    虚引用(Phantom Reference)是Java中一种比较特殊的引用类型,和软引用、弱引用类似,虚引用不会影响垃圾回收对象的生命周期,但是虚引用主要是用于对象被回收时的通知。 虚引用主要有两个作用: 控制对象回收时机 虚引用被实例化时需要与一个引用队列相关联,当对象被垃圾回收器标记为回收时,虚引用会被放入引用队列中,这时我们就可以通过判断引用队列中是否…

    Java 2023年5月10日
    00
  • JVM类加载机制原理及用法解析

    JVM类加载机制原理及用法解析 Java虚拟机是Java语言实现”Write Once, Run Anywhere”程序设计理念的一个关键组成部分,而Java虚拟机中最重要的一个子系统就是类加载子系统。该子系统负责对字节码文件(.class文件)中的类进行加载、验证、准备、解析、初始化等操作,从而在程序的运行中实现类的动态加载和管理。那么,下面我们就来详细讲…

    Java 2023年6月15日
    00
  • SpringCloud配置刷新原理解析

    SpringCloud配置刷新是指在不重启服务的情况下动态更新配置的能力。实现这个功能需要用到SpringCloud Config Server和SpringCloud Bus组件的支持。 具体实现过程如下: 配置SpringCloud Config Server 在配置文件中添加以下配置: spring.cloud.config.server.git.ur…

    Java 2023年6月15日
    00
  • 详述 tomcat 中的 server.xml 配置文件示例

    让我来详细讲解“详述 tomcat 中的 server.xml 配置文件示例”的完整攻略。 什么是 Tomcat 的 server.xml 配置文件 在 Tomcat 的安装目录下,有个叫做 conf 的目录,这里面有个叫做 server.xml 的文件,就是 Tomcat 的主要配置文件之一,用于配置一些全局的设置,如 Tomcat 的连接器、虚拟主机和安…

    Java 2023年5月19日
    00
  • SpringBoot环境下junit单元测试速度优化方式

    下面是详细讲解“SpringBoot环境下junit单元测试速度优化方式”的完整攻略。 SpringBoot环境下junit单元测试速度优化方式 背景 在我们进行Java项目的开发过程中,经常需要编写单元测试用例来验证程序的正确性。在进行单元测试时,测试用例的执行速度非常重要。 现在大多数Java项目都采用了SpringBoot框架来进行开发和测试。在这种情…

    Java 2023年5月20日
    00
  • mybatis自动建表的实现方法

    MyBatis是一个流行的ORM框架,可以让开发人员通过简单的配置实现Java对象与关系型数据库之间的映射。它支持自动建表,在配置文件中添加一些参数,就可以让MyBatis自动创建数据库表结构。下面是实现自动建表的步骤: 1. 添加自动建表所需的依赖 在pom.xml文件中添加如下依赖: <dependency> <groupId>o…

    Java 2023年5月20日
    00
  • 详解Func与Action区别

    当我们编写C#代码时,经常会遇到Func<T>和Action<T>这两个委托类型。它们都是 C# 环境中的通用委托类型,用于定义具有特定签名的同步方法。虽然它们在某些方面看起来相似,但实际上它们之间有一些重要的区别。 Func与Action的区别 Func和Action的定义 Func:表示一个带有返回值的函数的委托。它可以在不使用自…

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