用户认证

设置用户名、密码

1、配置文件

(1)application.properties

#用户名
spring.security.user.name=
#密码
spring.security.user.password=

(2)application.yaml

spring:
  security:
    user:
      #用户名
      name:
      #密码
      password: 

2、配置类:继承 WebSecurityConfigurerAdapter 类(已弃用)

3、实际开发中自定义实现类,从数据库查询用户信息

 

自定义实现类(示例)

1、创建配置类,指定 UserDetailsService 接口的实现类

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        //设置UserDetailsService、密码编码器
        auth.userDetailsService(userDetailsService).passwordEncoder(password());
    }

    @Bean
    PasswordEncoder password(){
        return new BCryptPasswordEncoder();
    }
}

2、编写实现类,返回 User 对象,User 对象包含用户名、密码、操作权限

@Service("userDetailsService")
public class MyUserDetailsService implements UserDetailsService {
    
    @Autowired
    private UserMapper userMapper;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        //调用userMapper方法,根据用户名查询数据库
        QueryWrapper<Users> wrapper = new QueryWrapper();
        wrapper.eq("username",username);
        Users users = userMapper.selectOne(wrapper);
        //数据库中没有用户名,认证失败
        if (user == null) {
            throw new UsernameNotFoundException("用户名不存在");
        }
        //从查询数据库返回的user对象中,获取用户名、密码
        List<GrantedAuthority> auths = AuthorityUtils.commaSeparatedStringToAuthorityList("admin");
        return new User(user.getUsername(),new BCryptPasswordEncoder().encode(user.getPassword()),auths);
    }
}

3、查询数据库

(1)引入依赖

<!-- MySQL驱动 -->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
</dependency>

<!-- 简化开发 -->
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

<!-- MyBatis-Plus启动器 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.2</version>
</dependency>

(2)创建数据库、数据表:users 表,三个字段(id,username,password) 

(3)配置数据库

#MySQL数据库连接
spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver 
    url: jdbc:mysql://localhost:3306/mybatis_plus?serverTimezone=GMT%2B8&characterEncoding=UTF-8&userSSL=false
    username: root 
    password: 123456

(4)创建 users 表对应 JavaBean

@Data
public class Users {
    private Integer id;
    private String username;
    private String password;
}

(5)创建 Mapper 接口 

@Repository
@Mapper
public interface UserMapper extends BaseMapper<Users> {
    
}

(6)扫描 Mapper:主配置类添加 @MapperScan("指定包路径")

 

自定义用户登陆页面

1、配置类中实现相关配置

@Override
protected void configure(HttpSecurity http) throws Exception {
    
    //开启自定义登陆页面
    http.formLogin()    
        //设置登陆页面
        .loginPage("/index.html")
        //登录访问路径
        .loginProcessingUrl("/user/login")
        //登录成功后,所跳转路径
        .defaultSuccessUrl("/test/success").permitAll()
        .and()
        //设置不需要认证,可以直接访问的页面
        .authorizeRequests().antMatchers("/","/test/hello","/user/login").permitAll()
        //所有用户都可以访问
        .anyRequest().authenticated(); 
}

2、创建相关页面、Controller 

(1)index.html(/user/login)

<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset="utf-8">
    <title>Title</title>
</head>
<body>
<form action="/user/login" method="post">
    用户名:<input type="text" name="username"/>
    <br/>
    密码:<input type="text" name="password"/>
    <br/>
    <input type="submit" value="login"/>
</form>
</body>
</html>

(2)Spring Security 自动创建 Controller

(3)Spring Security 底层要求:页面中默认账号、密码 name 属性必须为 username 和 password

public class UsernamePasswordAuthenticationFilter extends AbstractAuthenticationProcessingFilter {

    public static final String SPRING_SECURITY_FORM_USERNAME_KEY = "username";

    public static final String SPRING_SECURITY_FORM_PASSWORD_KEY = "password";

}
posted @   半条咸鱼  阅读(164)  评论(0编辑  收藏  举报
(评论功能已被禁用)
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示