Spring Security 5-认证认可

Spring Security提供基础的用户验证服务。

Spring Security有效

compile("org.springframework.boot:spring-boot-starter-security:$springBootVersion")

认证

主要通过 UserDetailsService 来检索用户信息,从而实现用户的验证,
如果只是添加了上面的Security依赖包的话,SpringBoot默认提供了Basic级别的安全架构,
通过UserDetailsService,默认生成了用户-User,密码-随机数字(可以在info的log中看到)的访问权限和界面,此时访问api或者form时,会显示SpringBoot默认提供的login界面,输入正确,跳转到你请求的页面,输入错误,显示–Bad credentials,提示重新输入。
当然也可以通过设置
spring.security.user.name
spring.security.user.password
自定义自己的用户名和密码。—最简单的方式,也是最不安全的方式
文档 boot-features-security
Spring Security 提供了几种方式来自己实现验证用户。

InMemory方式

继承 WebSecurityConfigurerAdapter 类,重写认证管理的实现方式,
具体实现类是;InMemoryUserDetailsManager

@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("hoge").password("HOGE").roles("USER");
    }
}

运行api请求看一下,输入指定 hoge / HOGE,发现登录不了,
参照 There is no PasswordEncoder mapped for the id “null”
原因是 SpringSecurity5 以上严格化了登陆密码的管理,即使是最简单的内存保存方式,也要求必须进行PasswordEncoder,最简单的解决办法是;
添加不使用Encoder的方式,当然只是单纯学习的话可以

@Bean
public static NoOpPasswordEncoder passwordEncoder() {
    return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
}

再次运行,实现自定义内存管理方式的登陆。
注意,由于cookie的存在,有可能下次请求时会不再出现登录窗口。

JDBC方式

通过DB管理的方式,
具体实现类是;JdbcUserDetailsManager

@Override
        protected void configure(AuthenticationManagerBuilder auth) throws Exception {
                // JDBC Type
                auth.userDetailsService(userDetailService);
        }

继承 userDetailService 新作User

@Service
public class AuthenticationService implements UserDetailsService {
  @Override
  public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    if (username == null || "".equals(username)) {
      throw new UsernameNotFoundException("Username is empty");
    }
    return  adminsRepository.findByLoginId(username);
  }

猜你喜欢

转载自blog.csdn.net/oblily/article/details/87807717