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日

相关文章

  • Spring Boot整合Spring Security简单实现登入登出从零搭建教程

    Spring Boot整合Spring Security简单实现登入登出从零搭建教程 Spring Security是一个功能强大且灵活的框架,用于保护Spring应用程序。在Spring Boot应用程序中,我们可以使用Spring Security来实现用户认证和授权。本文将详细讲解Spring Boot整合Spring Security简单实现登入登出…

    Java 2023年5月15日
    00
  • PHP MVC模式在网站架构中的实现分析

    PHP MVC模式在网站架构中的实现分析 什么是MVC模式 MVC即Model-View-Controller,模型-视图-控制器,是一种常用的软件设计模式,通过将应用程序分成不同的三个部分,来实现分离关注点(Separation of Concerns),来提高代码的可维护性和可重用性。 模型(Model):负责处理数据的读取和存储,以及对其进行逻辑处理。…

    Java 2023年5月20日
    00
  • Java中的对象和对象引用实例浅析

    让我们来详细讲解一下Java中的对象和对象引用实例浅析。 掌握对象和对象引用的基础概念 在Java中,对象是我们需要操作的数据实体。对象本身是占用内存空间的,所以我们需要引用来间接操作对象。对象引用指的是一个指针变量,它指向一个对象在内存中的位置。Java中的对象都是存储在堆内存中,而引用则可以存储在栈内存中。 对象的创建过程 对象的创建过程分为两个步骤:声…

    Java 2023年5月26日
    00
  • Spring MVC的国际化实现代码

    Spring MVC的国际化实现代码攻略 在Spring MVC中,我们可以使用国际化来实现多语言支持。本文将详细讲解Spring MVC的国际化实现代码,包括如何配置国际化资源文件、如何使用MessageSource对象获取国际化信息等。 配置国际化资源文件 在Spring MVC中,我们可以使用.properties文件来存储国际化信息。下面是一个示例代…

    Java 2023年5月18日
    00
  • 解决SpringBoot项目启动后网页显示Please sign in的问题

    针对SpringBoot项目启动后网页显示Please sign in的问题,一般是因为Spring Security认证授权机制未配置或配置不正确所致,可以采取以下步骤进行解决: 第一步:检查pom.xml中是否添加Spring Security依赖 启动Spring Security需要添加spring-boot-starter-security依赖,检…

    Java 2023年5月20日
    00
  • Eclipse中使用Maven创建Java Web工程的实现方式

    创建Java Web工程有多种方式,其中一种常用的方式就是使用Maven构建工具。下面我将详细讲解如何在Eclipse中使用Maven创建Java Web工程的实现方式,包括如下几个步骤: 安装Maven插件 创建Maven Web项目 添加Web和Servlet依赖 编写Servlet程序 配置并运行Tomcat服务器 下面逐一进行详细讲解: 1. 安装M…

    Java 2023年5月20日
    00
  • JAVA简单分组的算法实现

    JAVA简单分组的算法实现 在编写Java代码时,我们经常需要将数据按照一定规则进行分组,以便进行后续的统计分析或处理。下面是一种简单的分组算法实现方法。 关键思路 该算法实现的核心思路是建立一个数据结构来表示分组后的数据,然后使用循环遍历原始数据,将数据根据一定规则添加到相应的分组中。 实现步骤 定义分组数据结构 我们可以使用Java Map来表示分组数据…

    Java 2023年5月19日
    00
  • Java通过接口实现匿名类的实例代码

    在Java中,通过接口可以实现匿名类的实例代码。这可以帮助我们更加灵活地使用接口,并且避免在代码中大量声明类的情况。下面是实现这个过程的完整攻略: 步骤一:创建一个接口 首先,需要创建一个接口。接口是一个抽象的数据类型,它定义类应该实现的方法,但并不提供实现细节。这意味着在接口中声明的方法将在实现接口的类中被实现。 一个示例接口的代码如下: public i…

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