启用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日

相关文章

  • 使用Spring Boot的原因解析

    使用Spring Boot的原因解析 前言 Spring Boot 是 Spring 家族的一个全新项目,它通过提供自动配置、快速开发等一系列优化,使得 Spring 应用的开发更加简单、快速、便捷。那么为什么我们要选择使用 Spring Boot 呢?下面本文将从以下几个方面为大家详细介绍 Spring Boot 的使用原因。 解析 1. 自动配置 Spr…

    Java 2023年5月15日
    00
  • Java 实现简单Socket 通信的示例

    Java 实现简单 Socket 通信的示例 简介 Socket 是实现网络编程的一种工具,它能够通过网络连接实现两台计算机之间的数据传输。在 Java 中,可以通过使用 Socket 类和 ServerSocket 类来简单地实现 Socket 通信。 示例 1:Socket 客户端 import java.io.IOException; import j…

    Java 2023年5月19日
    00
  • 通过实例了解cookie机制特性及使用方法

    下面我将详细讲解“通过实例了解cookie机制特性及使用方法”的完整攻略。 什么是cookie cookie是一种客户端存储技术,用于保存用户在网站上的数据,常用的数据包括用户的登录状态、购物车内容等。cookie可以在不同的页面中共享数据,以此在用户与网站之间建立持久的关系。 cookie的特性 cookie是一种客户端存储技术,数据保存在用户的浏览器上;…

    Java 2023年5月20日
    00
  • 浅谈Spring Data如何简化数据操作的方法

    浅谈Spring Data如何简化数据操作的方法 对于数据操作,Spring Data 提供了一种简单高效的解决方案。该方案旨在尽量减少代码量,同时提供易于使用的API以简化开发。下面我们将从以下三个方面介绍 Spring Data: Spring Data 的架构 Spring Data 的特点 Spring Data 的常用操作 Spring Data …

    Java 2023年5月20日
    00
  • 自己动手写的mybatis分页插件(极其简单好用)

    下面是自己动手写的mybatis分页插件的完整攻略。 1. 目标 我们的目标是自己手写mybatis分页插件,以便在查询大数据量时能够更加高效地进行分页操作。 2. 环境准备 本教程的示例环境如下: 操作系统:Windows 10 开发工具:IntelliJ IDEA JDK版本:1.8 mybatis版本:3.4.6 3. 新建项目 首先,我们需要新建一个…

    Java 2023年5月19日
    00
  • Java Json字符串的双引号(“”)括号如何去掉

    想要去掉Java Json字符串中的双引号(“”)括号,需要使用Java中的字符串替换函数。以下是具体步骤: 获取Json字符串 要去掉Json字符串中的双引号(“”)括号,首先需要先获取Json字符串。可以使用Java中的字符串变量或从外部文件中读取文件内容等方法获取Json字符串。 用replaceAll()函数去掉双引号和括号 在Java中,使用rep…

    Java 2023年5月26日
    00
  • java计算π的多种方法

    Java 计算 π 的多种方法 在计算机科学中,π(圆周率)是一个非常有趣且重要的数学常数。由于π是一个无理数,不能用有限长的小数表示,因此我们需要使用其他方法来近似计算π。本文将介绍几种 Java 中计算π的方法。 1. 蒙特卡罗方法 蒙特卡罗方法是一种基于随机抽样的数值计算方法。这个方法的基本思想是在一个正方形内随机放置若干个点,并且判断每个点是否在以正…

    Java 2023年5月19日
    00
  • Java实现分页的前台页面和后台代码

    关于如何实现Java分页,需要分别从前台页面和后台代码两个部分进行讲解。 前台页面实现分页 在前台页面实现分页,主要采用的是利用jQuery的ajax异步加载技术来获取数据库中的数据,同时使用bootstrap的分页组件来实现分页。 示例代码如下: <!– 前台页面加载表格和分页组件 –> <table class="tabl…

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