SpringSecurity:认证

Posted 刚刚好。

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringSecurity:认证相关的知识,希望对你有一定的参考价值。

快速入门

1.引入依赖

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

2.编写controller

@RestController
public class HelloController{
@GetMapping("/hello")
public String hello(){
return "hello world";
}
}

启动项目后。我们发现访问\'/hello\'接口,会自动跳转到\'/login\'界面

下面我们来看一下这个流程

用户的生成

我们先来看一下spring security默认的用户生成
Spring Security使用UserDetailsService接口向认证器传入一个User实例(org.springframework.security.core.userdetails.User,有三个参数name,password,roles)

public interface UserDetailsService{
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}

loadUserByUsername有一个参数username接收用户认证时传入的用户名,开发中一般我们需要自定义实现UserDetailsService

Spring Security也为UserDetailsService提供了默认实现,InMemoryUserDetailsManager就是一种基于内存的实现。

默认情况下,Spring Security会提供一个InMemoryUserDetailsManager实例,可以通过SecurityPropertes类的getUser()方法获取到一个User实例(org.springframework.security.core.userdetails.User)

@configurationProperties(profix="spring.security")  //加载配置文件,因此可以在配置文件中指定账号密码
public class SecurityProperties{
   private User user=new User();
   public User getUser(){
   return this.user;
   }
   public static class User{
   private String name="user";
   private String password=UUID.randomUUID().toString();
   private List<String> roles=new ArrayList<>();
}
}

可以看到默认账号为user,密码为一串随机的UUID。同时,默认的密码会由getOrDeducePassword方法进行加密,如果没有指定加密方法,则只是会加一个前缀{noop}表明是明文存储。

自定义从数据库获取用户

//注意注册为bean交给容器管理
@Component
public class UserDateService implements UserDetailsService {
    @Autowired
    UserMapper userMapper;
    @Override
    public UserDetails loadUserByUsername(String phone) throws UsernameNotFoundException {
        //这是通过username查询获取一组数据将获得的数据传给security的User
        com.wang.pojo.User user = userMapper.getUserByPhone(phone);
        if (user == null) {
            throw new UsernameNotFoundException("该用户不存在!");
        }
        //把获得的账号密码传给security的User
        return new User(user.getPhone(), user.getPassword(), new ArrayList<>());
    }
}

以上是关于SpringSecurity:认证的主要内容,如果未能解决你的问题,请参考以下文章

SpringSecurity如何在代码中获取认证用户信息

SpringSecurity 认证详解

SpringSecurity+JWT认证流程解析

Spring Security-2-表单认证

springboot集成spring security实现restful风格的登录认证 附代码

关于配置Nginx反向代理后SpringSecurity认证失败的问题解决