Spring Security认证配置(一)
学习本章之前,可以先了解下上篇 Spring Security基本配置。
本篇主要讲述Spring Security基于表单,自定义用户认证配置(上篇中的配置,本篇将不再阐述)。一共分为三步:
1、处理用户信息获取
2、处理用户校验
3、处理密码加密解密
在配置之前,先熟悉下两个接口:
UserDetailsService
UserDetailsService接口用户返回用户相关数据。它有loadUserByUsername方法,根据用户名查询用户实体,可以实现该接口覆盖该方法,实现
自定义获取用户过程。该接口实现类被DaoAuthenticationProvider类使用,用于认证过程中载入用户信息
UserDetails与DaoAuthenticationProvider类的介绍可以查看AuthenticationManager、ProviderManager
public interface UserDetailsService {
//通过用户名查询user
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
PasswordEncoder
PasswordEncoder是一个关于密码操作的接口,常用的实现类为BCryptPasswordEncoder
public interface PasswordEncoder {
//对rawPassword加密
String encode(CharSequence rawPassword);
//判断rawPassword与encodedPassword是否匹配
boolean matches(CharSequence rawPassword, String encodedPassword);
}
接下来开始Spring Security自定义用户认证配置:
在SecurityConfig中配置PasswordEncoder
/**
* 密码加密(可自定义加密方式)
*/
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder();
}
自定义UserDetails的实现类(也可使用UserDetails的默认实现类User)
@Getter
@Setter
@AllArgsConstructor
public class MyUser implements UserDetails { private static final long serialVersionUID = 1L; private String username; private String password; @Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
} @Override
public boolean isAccountNonExpired() {
// 账户是否没有过期,默认true
return true;
} @Override
public boolean isAccountNonLocked() {
// 账户是否没有锁定,默认true
return true;
} @Override
public boolean isCredentialsNonExpired() {
// 密码是否没有过期,默认true
return true;
} @Override
public boolean isEnabled() {
// 账户是否可用,默认true
return true;
} }
自定义UserDetailsService的实现类
@Slf4j
@Service
public class MyUserDetailServiceImpl implements UserDetailsService { @Autowired
private PasswordEncoder passwordEncoder; /**
* 根据username查询用户实体
*/
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
log.info("进来了~"); //密码加密(这里是将密码写死的,真实情况应该是查询数据库)
String dbPassword = passwordEncoder.encode("");
log.info("数据库密码:{}", dbPassword);
MyUser user = new MyUser(username, dbPassword);
return user;
} }
在DaoAuthenticationProvider中设置两个断点,然后启动服务,可以看到Spring Security自动将我们的实现类注入到DaoAuthenticationProvider中:


访问http://localhost:18081/user,跳转到登录页

用户名随便输,密码为1234
Spring Security认证配置(一)的更多相关文章
- Spring Security认证配置(三)
学习本章之前,可以先了解下上篇Spring Security认证配置(二) 本篇想要达到这样几个目的: 1.登录成功处理 2.登录失败处理 3.调用方自定义登录后处理类型 具体配置代码如下: spri ...
- Spring Security认证配置(二)
学习本章之前,可以先了解下上篇Spring Security基本配置. 本篇想要达到这样几个目的: 1.访问调用者服务时,如果是html请求,则跳转到登录页,否则返回401状态码和错误信息 2.调用方 ...
- spring-security-4 (5)spring security Java配置实现自定义表单认证与授权
前面三篇讲解了spring security的搭建以及简单的表单认证与授权原理.本篇将实现我们自定义的表单登录与认证. 本篇不会再讲项目的搭建过程,因为跟第二节的搭建如出一辙.本篇也不会将项目中所有 ...
- Spring Security 入门(1-2)Spring Security - 从 配置例子例子 开始我们的学习历程
1.Spring Security 的配置文件 我们需要为 Spring Security 专门建立一个 Spring 的配置文件,该文件就专门用来作为 Spring Security 的配置. &l ...
- spring security 认证源码跟踪
spring security 认证源码跟踪 在跟踪认证源码之前,我们先根据官网说明一下security的内部原理,主要是依据一系列的filter来实现,大家可以根据https://docs.sp ...
- SPRING SECURITY JAVA配置:Web Security
在前一篇,我已经介绍了Spring Security Java配置,也概括的介绍了一下这个项目方方面面.在这篇文章中,我们来看一看一个简单的基于web security配置的例子.之后我们再来作更多的 ...
- Spring Security 从配置入门 学习讲解。万恶之源------------web.xml
这段时间,工作闲了下来,接触了Spring Security,对于我一个基础很差的人来说,无疑是个挑战啊. 经过一段时间的摸索,终于有了点眉目,在这里,要特别感谢http://blog.csdn.ne ...
- Spring Security 从配置入门 学习讲解。刽子手------------securityConfig.xml
不知道我的web.xml 大家都理解了没. 废话确实有点多,可能很多知识点,大家都知道,可是我学的时候,压根什么都不懂啊.... 这篇我们要讲刽子手 securityConfig. 为什么要说他是 ...
- Spring Security 入门(1-4-2)Spring Security - 认证过程之AuthenticationProvider的扩展补充说明
1.用户信息从数据库获取 通常我们的用户信息都不会向第一节示例中那样简单的写在配置文件中,而是从其它存储位置获取,比如数据库.根据之前的介绍我们知道用户信息是通过 UserDetailsService ...
随机推荐
- iOS_URI跳转方式多种地图导航的代码实践
先来看一下我们要达到什么效果,就是当我们点导航的时候,会弹出下面这个选择列表. 当然,如果没有安装某个地图APP,那么对应的选项是不会出现的.检测APP是否安装,只要调用下面这个方法就可以了 [[UI ...
- Junit测试时,如何截获到Console的输出
RT: 参考如下Junit 测试代码: 注释部分 import java.io.ByteArrayOutputStream; import java.io.PrintStream; import st ...
- Windows核心编程:第2章 字符和字符串处理
Github https://github.com/gongluck/Windows-Core-Program.git //第2章 字符和字符串处理.cpp: 定义应用程序的入口点. // #incl ...
- centos部署yapi爬坑记
前言 这几天终于完成了为期三个月的公司某个demo版的项目,在这期间和公司的后台因为API的事怼过无数次了,'我的接口没问题,是你请求的方式不对吧!'.'一定是你请求的参数不对'......诸如此类问 ...
- 「PKUSC2018」最大前缀和(状压dp)
前言 考试被\(hyj\)吊着打... Solution 考虑一下如果前缀和如果在某一个位置的后面的任意一个前缀和都<=0,肯定这就是最大的. 然后这样子就考虑左右两边的状压dp,然后就好了. ...
- 201621123018《java程序设计》第13周作业总结
1. 本周学习总结 2. 为你的系统增加网络功能(购物车.图书馆管理.斗地主等)-分组完成 为了让你的系统可以被多个用户通过网络同时使用,需要为你的系统增加网络功能. 2.1 简述你想为你的系统增加什 ...
- JDK提供的四种线程池代码详解
一.线程池什么时候使用,会给我们带来什么好处? 如果很多用户去访问服务器,用户访问服务器的时间是非常短暂的,那么有可能在创建线程和销毁线程上花费的时间会远远大于访问所消耗的时间,如果采用线程池会使线程 ...
- Spring Boot + Redis
启动redis docker run --name redisServer -P -d redis redis自带客户端,启动客户端 docker run -it --link redisServer ...
- 怎么样imageview实现铺满全屏
<ImageView android:layout_width="match_parent" android:layout_height="match_parent ...
- h5实现输入框fixed定位在屏幕最底部兼容性
1.问题由来 做h5 已经有很长一段时间了,现在做的工作h5比pc上的更多,曾经解决pc端IE各个版本的兼容性也是伤透脑筋,原以为h5的会更好,殊不知,还有更头疼的问题,当设计师要设计一个聊天窗口,把 ...