SpringBoot 配合 SpringSecurity 实现自动登录功能的代码

下面我就来详细讲解一下 “SpringBoot 配合 SpringSecurity 实现自动登录功能的代码”的完整攻略。

什么是自动登录功能

自动登录(Remember Me)是指用户可以选择保存登录状态,保留一定时间不失效。这样用户可以在再次打开网站时,不需要重新输入用户名密码,而是直接使用之前的登录信息登录进去。

操作步骤

1. 导入相关依赖

在 pom.xml 中添加以下依赖:

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

2. 配置 Spring Security

创建一个类来继承 WebSecurityConfigurerAdapter 类,同时重写其 configure() 方法,在该方法中添加相关配置,如下所示:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private MyUserDetailService myUserDetailService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/", "/login").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .loginPage("/login")
                .defaultSuccessUrl("/index")
                .and()
                .logout()
                .logoutRequestMatcher(new AntPathRequestMatcher("/logout"))
                .logoutSuccessUrl("/login")
                .and()
                .rememberMe()
                .tokenRepository(persistentTokenRepository())
                .rememberMeCookieName("my-remember-me")
                .tokenValiditySeconds(60 * 60 * 24 * 7)
                .userDetailsService(myUserDetailService)
                .and()
                .csrf()
                .ignoringAntMatchers("/h2-console/**");
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(myUserDetailService);
    }

    @Bean
    public PersistentTokenRepository persistentTokenRepository() {
        JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
        tokenRepository.setDataSource(dataSource);
        return tokenRepository;
    }
}

3. 编写 UserDetails 实现类

在项目中新建一个实现了 UserDetails 接口的类 MyUserDetail,添加必要的字段和方法。

public class MyUserDetail implements UserDetails {
    private String username;
    private String password;
    private List<SimpleGrantedAuthority> authorities;

    public MyUserDetail(String username, String password, List<SimpleGrantedAuthority> authorities) {
        this.username = username;
        this.password = password;
        this.authorities = authorities;
    }

    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return authorities;
    }

    @Override
    public String getPassword() {
        return password;
    }

    @Override
    public String getUsername() {
        return username;
    }

    // 没有过期
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }

    // 未锁定
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }

    // 密码未过期
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }

    // 未禁用
    @Override
    public boolean isEnabled() {
        return true;
    }
}

4. 编写 UserDetailsService 实现类

实现 UserDetailsService 接口,重写其 loadUserByUsername() 方法,在其中查询用户信息。

@Service
public class MyUserDetailService implements UserDetailsService {

    @Autowired
    private JdbcTemplate jdbcTemplate;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        String sql = "select * from user where username = ?";
        List<Map<String, Object>> list = jdbcTemplate.queryForList(sql, username);
        if (list.isEmpty()) {
            throw new UsernameNotFoundException("用户不存在!");
        }
        Map<String, Object> map = list.get(0);
        String password = map.get("password").toString();
        List<SimpleGrantedAuthority> authorities = Collections.singletonList(new SimpleGrantedAuthority("USER"));
        return new MyUserDetail(username, password, authorities);
    }
}

5. 编写登录页面和成功页面

<!-- 登录页面 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Login Page</title>
</head>
<body>
<h1>Login Page</h1>
<form action="/login" method="post">
    <label for="username">Username</label>
    <input type="text" id="username" name="username" required>
    <br>
    <label for="password">Password</label>
    <input type="password" id="password" name="password" required>
    <br>
    <input type="checkbox" id="rememberMe" name="remember-me">
    <label for="rememberMe">Remember me</label>
    <br>
    <input type="submit" value="Login">
</form>
</body>
</html>

<!-- 成功页面 -->
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Success Page</title>
</head>
<body>
<h1>Login Success!</h1>
<a href="/logout">Logout</a>
</body>
</html>

示例1

第一个示例,访问 /admin,需要有 ADMIN 权限才可以访问。

@RestController
@RequestMapping("/admin")
@PreAuthorize("hasRole('ADMIN')")
public class AdminController {

    @GetMapping
    public String hello() {
        return "Hello, Admin!";
    }
}

示例2

第二个示例,展示如何在 Controller 中获取当前登录用户信息。

@RestController
public class HelloController {

    @GetMapping("/hello")
    public String hello(Authentication authentication) {
        String username = authentication.getName();
        return "Hello, " + username + "!";
    }
}

总结

这就是 SpringBoot 配合 SpringSecurity 实现自动登录的完整攻略,主要的步骤就是导入相关依赖,配置 Spring Security,编写 UserDetails、UserDetailsService 实现类,以及编写登录页面和成功页面。示例代码展示了如何在 Controller 中获取当前登录用户信息,以及如何限制特定用户访问某些资源。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot 配合 SpringSecurity 实现自动登录功能的代码 - Python技术站

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

相关文章

  • mybatis原理概述入门教程

    介绍 MyBatis是一种持久层框架,它允许你使用普通SQL查询、存储过程和高级映射,以及高级映射的结果集和连接。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及缓存代码的需求。MyBatis可以与Spring框架集成。 MyBatis原理概述包括以下方面: 1.配置文件 2.映射文件 3.会话工厂 4.SqlSessionFactoryBui…

    Java 2023年5月20日
    00
  • Eclipse启动Tomcat时报Error loading WebappClassLoader错误的解决方法

    下面是详细讲解“Eclipse启动Tomcat时报Error loading WebappClassLoader错误的解决方法”的完整攻略。 1.问题分析 当我们在Eclipse中启动Tomcat时,有可能会遇到以下错误: Error loading WebappClassLoader context: /project delegate: false re…

    Java 2023年5月19日
    00
  • 详解Java动态加载数据库驱动

    详解Java动态加载数据库驱动 在Java编程中,连接数据库是必不可少的操作,而加载数据库驱动是连接数据库的第一个步骤。本文将详细讲解如何使用Java动态加载数据库驱动,并提供两条示例说明。 什么是动态加载数据库驱动? Java中,使用JDBC连接数据库需要用到相应的数据库驱动,而加载数据库驱动是连接数据库的第一个必要步骤。传统的方式是使用Class.for…

    Java 2023年6月16日
    00
  • java8异步调用如何使用才是最好的方式

    Java 8的异步处理使得编写高效、可伸缩和可维护的应用程序变得更加容易。在本文中,我们将讨论Java 8异步调用的最佳实践。以下是步骤: 步骤一:使用CompletableFuture Java 8中引入的CompletableFuture是一个非常有用的类,可以轻松地进行异步调用和结果处理。要使用它,您需要使用两个主要方法: supplyAsync() …

    Java 2023年5月26日
    00
  • 浅析Java的Hibernate框架中的缓存和延迟加载机制

    浅析Java的Hibernate框架中的缓存和延迟加载机制 Hibernate是一个广泛使用的Java对象关系映射(ORM)框架,用于将数据库中的数据映射到Java程序中的对象上。Hibernate中的缓存和延迟加载机制是其非常重要的特性之一,下面将会详细介绍这两个机制。 Hibernate中的缓存机制 Hibernate中的缓存机制用于在Hibernate…

    Java 2023年5月20日
    00
  • javaweb中mysql数据库连接步骤方法及其实例

    下面是“javaweb中mysql数据库连接步骤方法及其实例”的完整攻略。 步骤一:下载并安装MySQL 这一步很简单,直接去MySQL官网下载MySQL安装包,并按照安装向导进行安装。 步骤二:创建数据库和数据表 在安装好MySQL后,通过MySQL的客户端命令行或者图形界面工具(如Navicat等)连接MySQL并创建一个新的数据库,然后在该数据库下创建…

    Java 2023年5月19日
    00
  • mybatis中mapper-locations的作用

    下面是关于”Mybatis中mapper-locations的作用”的详细攻略: 1. 什么是mapper-locations mapper-locations是Mybatis配置文件mybatis-config.xml中的一个节点,它的作用是指定Mybatis的mapper文件位置。 在mybatis-config.xml中,mapper-location…

    Java 2023年6月15日
    00
  • MyBatis映射关系详解

    下面是对”MyBatis映射关系详解”的详细解释及示例。 MyBatis映射关系详解 在MyBatis框架中,映射关系是将SQL语句和Java对象之间的关系进行映射,使得Java对象和数据库表之间的操作变得简单。在MyBatis中,映射关系可以通过XML文档或注解进行配置。 XML映射关系配置 XML映射关系配置主要包括以下两个部分: 结果映射 结果映射是将…

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