spring boot security实现自动登入

本文详细介绍了如何使用Spring Security进行权限管理和自动登录配置,包括设置登录注销路由、自定义403页面、登录页面与处理URL,以及前端表单中自动登录功能的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原理截图:(引用尚硅谷视频中的流程图)

 

1修改配置类

//实现自动登入
@Autowired
private DataSource dataSource;
@Bean
public PersistentTokenRepository persistentTokenRepository(){
    JdbcTokenRepositoryImpl jdbcTokenRepository=new JdbcTokenRepositoryImpl();
    jdbcTokenRepository.setDataSource(dataSource);
    jdbcTokenRepository.setCreateTableOnStartup(true);
    return jdbcTokenRepository;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.logout().logoutUrl("logout").// 设置触发链接
            logoutSuccessUrl("/test/add").permitAll();//设置退出登入自动跳转
    http.exceptionHandling().accessDeniedPage("/unauth.html");//自定义403页面
    http.formLogin()
            .loginPage("/login.html")//自定义跳转登录页面
            .loginProcessingUrl("/user/login")//登录访问路径
            .defaultSuccessUrl("/test/index").permitAll()//登录成功之后,跳转路径
            .and().authorizeHttpRequests()//自定义哪些请求需要保护
                    .antMatchers("/","/test/add","/user/login").permitAll()//自定义哪些请求不需要保护
                    //配置用户权限
                    //.antMatchers("/test/index").hasAuthority("admins")//当前登录用户只有admin是权限才访问这个路径(只针对单个权限)
                    //.antMatchers("/test/index").hasAnyAuthority("admins","manager")//当前登录用户只有admin是权限才访问这个路径(针多个权限)
                    //.antMatchers("/test/index").hasRole("sale")//源码中将变成ROLE_sale所以在权限列表时应添加ROLE_前缀(与第一个差不多单权限)
                    //.antMatchers("/test/index").hasAnyRole("sale","admins")//与上一致但是是多用户权限
            .anyRequest().authenticated()
            .and().rememberMe().tokenRepository(persistentTokenRepository())
            .tokenValiditySeconds(60)//设置有效时长,单位秒
            .userDetailsService(userDetailsService)
            .and().csrf().disable();//关闭csrf防护
}

2 添加前端自动登入键注意name必须为remember-me

<body>
    <form action="/user/login"method="post">
      用户名:<input type="text" name="username"/>
        <br/>
      密码:<input type="text" name="password"/>
        <br/>
        <input type="checkbox" name="remember-me"/>自动登入
        <br/>
      <input type="submit" value="login"/>
​
    </form>
</body>

实现截图:

 

### 创建 Spring Boot 登录和注册页面 在 Spring Boot实现登录和注册功能通常涉及多个组件,包括前端页面设计、后端控制器逻辑以及数据库交互。以下是具体实现方法: #### 前端页面 (HTML/Thymeleaf) 可以使用 Thymeleaf 或其他模板引擎来构建登录和注册页面。 ```html <!-- login.html --> <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Login</title> </head> <body> <form th:action="@{/login}" method="post"> Username: <input type="text" name="username"/><br/> Password: <input type="password" name="password"/><br/> <button type="submit">Login</button> </form> </body> </html> <!-- register.html --> <!DOCTYPE html> <html xmlns:th="http://www.thymeleaf.org"> <head> <title>Register</title> </head> <body> <form th:action="@{/register}" method="post"> Username: <input type="text" name="username"/><br/> Email: <input type="email" name="email"/><br/> Password: <input type="password" name="password"/><br/> Confirm Password: <input type="password" name="confirmPassword"/><br/> <button type="submit">Register</button> </form> </body> </html> ``` 这些页面可以通过 `@Controller` 类中的映射路径访问。 --- #### 后端逻辑 (Java Controller 和 Service 层) ##### 控制器层 (`UserController.java`) 定义处理请求的接口。 ```java package com.example.controller; import com.example.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; @Controller public class UserController { @Autowired private UserService userService; @GetMapping("/login") public String showLoginPage() { return "login"; } @PostMapping("/login") public String handleLogin(@RequestParam("username") String username, @RequestParam("password") String password) { if (userService.authenticate(username, password)) { return "redirect:/home"; // 跳转到主页或其他页面 } else { return "error"; // 返回错误页面 } } @GetMapping("/register") public String showRegistrationPage() { return "register"; } @PostMapping("/register") public String handleRegistration(@RequestParam("username") String username, @RequestParam("email") String email, @RequestParam("password") String password) { try { userService.registerUser(username, email, password); return "success"; // 注册成功后的提示页 } catch (Exception e) { return "error"; // 错误页面 } } } ``` --- ##### 服务层 (`UserService.java`) 负责业务逻辑操作。 ```java package com.example.service; import com.example.model.User; import com.example.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.stereotype.Service; @Service public class UserService { @Autowired private UserRepository userRepository; @Autowired private BCryptPasswordEncoder bCryptPasswordEncoder; public boolean authenticate(String username, String password) { User user = userRepository.findByUsername(username); if (user != null && bCryptPasswordEncoder.matches(password, user.getPassword())) { return true; } return false; } public void registerUser(String username, String email, String password) throws Exception { if (userRepository.existsByUsername(username)) { throw new Exception("用户名已存在"); } User newUser = new User(); newUser.setUsername(username); newUser.setEmail(email); newUser.setPassword(bCryptPasswordEncoder.encode(password)); userRepository.save(newUser); } } ``` --- ##### 数据库实体类 (`User.java`) 用于表示用户的表结构。 ```java package com.example.model; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @Entity @Data @NoArgsConstructor @AllArgsConstructor public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String username; private String email; private String password; } ``` --- ##### 数据库存储 (`UserRepository.java`) 通过 JPA 提供数据持久化支持。 ```java package com.example.repository; import com.example.model.User; import org.springframework.data.jpa.repository.JpaRepository; import java.util.Optional; public interface UserRepository extends JpaRepository<User, Long> { Optional<User> findByUsername(String username); boolean existsByUsername(String username); } ``` --- #### 安全配置 (`SecurityConfig.java`) 启用基于角色的安全控制。 ```java package com.example.config; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration @EnableGlobalMethodSecurity(prePostEnabled = true) public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/", "/home", "/register").permitAll() .anyRequest().authenticated() .and() .formLogin() .loginPage("/login") .defaultSuccessUrl("/home") .permitAll() .and() .logout() .permitAll(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.inMemoryAuthentication() .withUser("admin").password("{noop}password").roles("ADMIN"); } } ``` 上述代码实现了基本的身份验证机制[^3]。 --- #### 总结 以上展示了如何利用 Spring Boot 构建简单的登录和注册功能。它涵盖了从前端页面到后端逻辑的设计过程,并集成了安全框架以保护应用资源。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值