springSecurity实现简单的登录功能

下面我将为您详细讲解“springSecurity实现简单的登录功能”的完整攻略。

1. 添加依赖

Spring Security是Spring的一个子项目,我们只需要在pom.xml文件中添加以下依赖即可:

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.4.6</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.4.6</version>
</dependency>

2. 配置Spring Security

在Spring Security的配置类中,我们需要做以下几个步骤:

2.1 配置WebSecurity

通过继承WebSecurityConfigurerAdapter并重写configure方法,配置HttpSecurity和AuthenticationManagerBuilder。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService; // 用户信息Service

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/login").permitAll() // 放行登录请求
                .anyRequest().authenticated() // 其他请求需要认证
                .and()
            .formLogin()
                .loginPage("/login") // 指定登录页面URL
                .defaultSuccessUrl("/index") // 登录成功后重定向的URL
                .permitAll()
                .and()
            .logout()
                .logoutSuccessUrl("/login") // 退出登录后重定向的URL
                .permitAll();
    }

    /**
     * 配置UserDetailsService和密码加密算法
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)
            .passwordEncoder(new BCryptPasswordEncoder());
    }
}

2.2 配置UserDetailsService

我们需要自定义一个UserDetailsService,用于加载用户信息到Spring Security中。在实现UserDetailsService接口的loadUserByUsername方法中,根据用户名返回相应的用户信息。

@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserService userService; // 用户信息Service

    /**
     * 根据用户名获取用户信息
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userService.getUserByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户不存在");
        }
        List<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(new SimpleGrantedAuthority(user.getRole()));
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
                authorities);
    }

}

2.3 配置密码加密算法

配置BCryptPasswordEncoder作为密码加密算法。在configure方法中进行配置。

.passwordEncoder(new BCryptPasswordEncoder())

3. 创建登录页面

在视图中创建一个登录页面login.html,用于输入用户名和密码。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<h1>登录页面</h1>
<form action="/login" method="POST">
    <table>
        <tr>
            <td><label for="username">用户名:</label></td>
            <td><input type="text" id="username" name="username"></td>
        </tr>
        <tr>
            <td><label for="password">密码:</label></td>
            <td><input type="password" id="password" name="password"></td>
        </tr>
        <tr>
            <td></td>
            <td><button type="submit">登录</button></td>
        </tr>
    </table>
</form>
</body>
</html>

4. 创建登录后的页面

在视图中创建一个登录后的页面index.html,用于展示登录成功的信息。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>登录成功</h1>
<p>欢迎您,${username}</p>
<a href="/logout">退出登录</a>
</body>
</html>

5. 创建控制器

创建一个控制器UserController,用于处理登录和退出登录的请求。

@Controller
public class UserController {

    @GetMapping({ "/", "/login" })
    public String login() {
        return "login";
    }

    @GetMapping("/index")
    public String index(Model model) {
        // 获取登录用户的信息
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        if (principal instanceof UserDetails) {
            String username = ((UserDetails)principal).getUsername();
            model.addAttribute("username", username);
        }
        return "index";
    }

}

示例一

以下是一个基于示例的Spring Boot应用程序:

  1. 在pom.xml文件中添加相关依赖
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.4.6</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.4.6</version>
</dependency>
  1. 创建WebSecurityConfig类。
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

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

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)
            .passwordEncoder(new BCryptPasswordEncoder());
    }
}
  1. 创建UserDetailsServiceImpl类。
@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserService userService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userService.getUserByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户不存在");
        }
        List<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(new SimpleGrantedAuthority(user.getRole()));
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
                authorities);
    }
}
  1. 创建UserController类。
@Controller
public class UserController {

    @GetMapping({ "/", "/login" })
    public String login() {
        return "login";
    }

    @GetMapping("/index")
    public String index(Model model) {
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        if (principal instanceof UserDetails) {
            String username = ((UserDetails)principal).getUsername();
            model.addAttribute("username", username);
        }
        return "index";
    }

}
  1. 创建login.html和index.html模版。

  2. 运行应用程序并访问http://localhost:8080/login。

示例二

下面是一个基于示例的Spring MVC应用程序:

  1. 在pom.xml文件中添加相关依赖
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-web</artifactId>
    <version>5.4.6</version>
</dependency>
<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-config</artifactId>
    <version>5.4.6</version>
</dependency>
  1. 配置Spring Security

创建WebSecurityConfig,配置HttpSecurity和AuthenticationManagerBuilder。

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

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

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService)
            .passwordEncoder(new BCryptPasswordEncoder());
    }
}
  1. 创建UserDetailsServiceImpl类。
@Service
public class UserDetailsServiceImpl implements UserDetailsService {

    @Autowired
    private UserService userService;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userService.getUserByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("用户不存在");
        }
        List<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(new SimpleGrantedAuthority(user.getRole()));
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(),
                authorities);
    }
}
  1. 创建UserController类。
@Controller
public class UserController {

    @GetMapping({ "/", "/login" })
    public String login() {
        return "login";
    }

    @GetMapping("/index")
    public String index(Model model) {
        Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
        if (principal instanceof UserDetails) {
            String username = ((UserDetails)principal).getUsername();
            model.addAttribute("username", username);
        }
        return "index";
    }

}
  1. 创建login.jsp和index.jsp。

  2. 运行应用程序并访问http://localhost:8080/login.jsp。

以上就是Spring Security实现简单的登录功能的完整攻略,希望对您有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:springSecurity实现简单的登录功能 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 一文秒懂 kafka HA(高可用)

    一文秒懂 kafka HA(高可用) 什么是 Kafka HA? 在 Kafka 中,为了确保数据的可靠性和高可用性,你需要使用多个 Kafka Broker 构建 Kafka 集群。当 Kafka 集群中的某个 Broker 失效时,整个集群依然能够正常运行,数据不会发生丢失或损坏。这就是 Kafka 的高可用性(HA)特性。 如何配置 Kafka HA?…

    Java 2023年5月20日
    00
  • IDEA项目maven project没有出现plugins和Dependencies问题

    下面是详细讲解“IDEA项目maven project没有出现plugins和Dependencies问题”的完整攻略: 1. 确认Maven配置 首先,需要确认Maven的配置是否正确。可以通过以下步骤查看: 在IntelliJ IDEA中打开Maven项目 在右侧的Maven Projects工具窗口中展开“Plugins”和“Dependencies”…

    Java 2023年6月2日
    00
  • Java判断对象是否为空(包括null ,””)的方法

    判断对象是否为空是Java开发中非常常见的操作,正确的判断方式可以避免很多空指针异常的出现。以下是几种常见的判断对象是否为空的方法。 1.使用“==”运算符判断是否为null 在Java中,使用“==”运算符判断对象是否为null是最常用的方式,代码示例如下: Object obj = null; if (obj == null) { // 对象为空 } e…

    Java 2023年5月26日
    00
  • java文件读写工具类分享

    Java文件读写工具类分享 在Java开发中,文件读写是一个十分普遍的操作。本文将会分享一个Java文件读写工具类,方便大家在开发中快速处理文件读写,提高开发效率。 工具类实现 Java文件读写需要使用到IO流,我们可以封装一个工具类,提供常见的文件读写操作。示例代码如下: import java.io.*; public class FileUtil { …

    Java 2023年5月20日
    00
  • 如何使用MyBatis框架实现增删改查(CRUD)操作

    使用MyBatis框架实现增删改查(CRUD)操作是非常简单的,在下面的攻略中,我将展示如何使用MyBatis框架来完成这些操作。 准备工作 在开始使用MyBatis框架之前,你需要完成以下准备工作: 确定数据库连接信息,包括数据库名称、用户名和密码等。 安装MyBatis框架和相关依赖。 创建数据库表 首先我们需要创建一张用于存储数据的表,例如创建一个名为…

    Java 2023年5月20日
    00
  • 使用ObjectMapper解析json不用一直new了

    ObjectMapper 是一个流行的 Java 库,用于将 JSON 对象与 Java 对象相互转换。在使用 ObjectMapper 的时候,常常需要实例化一个 ObjectMapper 对象,然后使用它来完成 JSON 和 Java 对象之间的转换操作。然而,这样会导致代码的冗长和臃肿。本攻略介绍如何使用 ObjectMapper 解析 JSON 不用…

    Java 2023年5月26日
    00
  • Java编程中二维数组的初始化和基本操作实例

    Java编程中二维数组的初始化和基本操作实例 什么是二维数组? 在Java中,数组是一种引用数据类型。如果数组的元素也是数组,那么这个数组就称为二维数组。二维数组实际上就是一个包含其他数组的数组,对于一个二维数组,我们可以把它想象成一个表格,其中每一个元素都有行和列的下标来确定它的位置。 如何初始化二维数组? 在 Java 中,我们可以使用两种方式来初始化一…

    Java 2023年5月26日
    00
  • Jmeter常见函数使用方法汇总

    Jmeter常见函数使用方法汇总 在Jmeter测试中,我们经常需要使用函数来对数据进行处理,Jmeter提供了许多常用的函数,可以用于解析、处理、比较等一系列操作。本文将详细介绍Jmeter常见函数的使用方法,并提供两个示例说明。 一、Jmeter常见函数 Jmeter提供了丰富的内置函数,以下是常见的几个: __time:返回当前的时间戳。 __thre…

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