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

yizhihongxing

下面是启用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日

相关文章

  • SpringBoot使用JDBC获取相关的数据方法

    下面是SpringBoot使用JDBC获取相关数据的操作攻略: 准备工作 首先,我们需要在pom.xml文件中添加JDBC依赖,可以添加MySQL、Oracle等依赖,这里以MySQL为例,pom.xml文件中添加以下依赖: <dependency> <groupId>mysql</groupId> <artifac…

    Java 2023年5月20日
    00
  • Java如何优雅的实现微信登录注册

    那我就来详细讲解一下 Java 如何优雅地实现微信登录注册的攻略吧。 1. 准备工作 要实现微信登录注册,首先需要在微信开放平台申请并获取到对应的 APP ID 和 APP SECRET。 2. 获取微信授权码 用户在使用微信应用时,需要先授权给第三方应用,获得授权之后,第三方应用可以获得用户的微信授权码,然后通过该授权码获取到用户的微信信息。 2.1 获取…

    Java 2023年5月23日
    00
  • Java 实战项目之家居购物商城系统详解流程

    Java 实战项目之家居购物商城系统详解流程攻略 1. 项目背景 “家居购物商城系统”是一个基于Java技术栈,以SpringBoot作为基础构建实现的一款网上商城系统。本系统致力于实现商品的浏览、下单、支付等功能,并将其展示在一个易于理解和操作的平台上。本系统结构简洁合理、功能完整、易于拓展和维护,是一个非常优秀的小型电子商务平台。 2. 技术框架 本系统…

    Java 2023年5月24日
    00
  • JSP 获取真实IP地址的代码

    JSP 获取真实IP地址的代码攻略如下: 步骤一:获取HttpServletRequest对象 首先,我们需要获取HttpServletRequest对象,因为它包含了对象的许多属性和方法。在JSP中,可以直接使用内置对象request获取HttpServletRequest对象。 <% HttpServletRequest request = (Ht…

    Java 2023年6月15日
    00
  • javaWeb使用Kaptcha组件生成验证码

    下面为您详细讲解“javaWeb使用Kaptcha组件生成验证码”的完整攻略。 什么是Kaptcha组件 Kaptcha是Google code上的一个开源项目,是一个Java的验证码组件,可用于生成验证码。 Kaptcha组件的优点 与其他验证码组件相比,Kaptcha组件有以下优点: 易于使用和集成。 提供了丰富的配置选项,可以自由定制验证码图片样式。 …

    Java 2023年6月15日
    00
  • Java后缀数组之求sa数组的实例代码

    Java后缀数组是一种经典的字符串匹配算法,可以实现快速求解字符串的后缀数组(sa数组)。下面我们将介绍如何在Java中编写求解sa数组的实例代码。 步骤一:构造后缀数组 首先我们需要准备一个包含原始字符串所有后缀的数组(称为“后缀数组”)。这个数组的元素类型为Suffix,其中Suffix类的定义如下: class Suffix implements Co…

    Java 2023年5月26日
    00
  • 在Java中使用日志框架log4j的方法

    在Java应用开发中,使用日志工具是非常重要的,可以帮助开发者快速地发现和解决应用程序中的问题。其中,log4j是Java开发中常用的一种日志框架,提供了一套完整的日志管理系统,支持多种日志级别、日志输出、日志滚动等功能。下面是使用log4j框架的方法攻略。 步骤一:引入log4j的依赖库 log4j是Java中的一个开源项目,因此可以很方便地通过Maven…

    Java 2023年5月26日
    00
  • Java实现Excel导入导出的步骤详解

    Java实现Excel导入导出的步骤详解 Excel导入导出在日常开发中非常常见,Java语言作为一种非常流行的开发语言,在Excel导入导出方面也提供了很好的支持,本文将为大家详细介绍Java实现Excel导入导出的步骤。 相关技术介绍 在Java语言中,常用的Excel导入导出技术有以下几种: POI技术:免费的Java API,可以新建表格,也可以读写…

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