回到序章来来来,点这
总结的说就是通过自定义 UsernamePasswordAuthenticationToken 的 details 实现检验。
正文在没事干的情况下,登陆成功后通过下面的命令打印了一下当前登陆用户的 authentication。
1System.out.println(SecurityContextHolder.getContext().getAuthentication().toString());
得到的结果是:
1UsernamePasswordAuthenticationToken [Principal=SysUser(id=1, username=user1, password=123, nickName=测试账号1, locked=true, status=1, roles=[SysRole(id=1, code=test1, name=test1角色)]), Credentials=[PROTECTED], Authenticated=true, Details=WebAuthenticationDetails [RemoteIpAddress ...
回到序章来来来,点这
流程详解在介绍认证流程的时候,整理过一个表单登陆的大致流程如下:
终端发起登陆请求
认证过滤器 UsernamePasswordAuthenticationFilter 拦截到请求,处理认证逻辑,在这里获得登陆信息,根据获得的登陆信息创建出未认证的 Authentication( 这里对应的是 UsernamePasswordAuthenticationToken 对象 ),然后将对象交给认证管理器
认证管理器循环所有的 AuthenticationProvider,找到对应的 provider 进行认证 3.1. 认证管理器 AuthenticationManager 维护着许多 AuthenticationProvider,这些 AuthenticationProvider 分别用来认证不同类型的请求,例如:表单、第三方 等
认证成功后,生成一个已认证的 Authentication,并将其通过 SecurityContextHolder.getContext().setAuthentication(authResult); 写到 SecurityCont ...
回到序章来来来,点这
前言在使用其他网站的时候,像 Gitee、博客园啥的,上面都有一个“记住我”的复选框,点击之后,即时后面关掉浏览器,甚至关机后再重启,也不用登陆就可以直接用。spring security 自然也有实现了这个,本章就介绍这个。
代码实现存储在内存Security 配置类在 configure(HttpSecurity http) 方法中找个位置增加代码
1.rememberMe().and()
前端网页增加记住我的复选框,关键是 name 值必须等于 remmember-me
1记住密码: <input type="checkbox" name="remember-me" /><br />
如果想要更改这里的 name 值,配置类也需要对应的更新
1.rememberMe().rememberMeParameter("你想用的name值").and()
在登陆的时候勾上复选框,即可实现。
下面是在浏览器检查元素中的部分截图。
也可以进检查元素 - Application ...
MySQL5.7授予权限并更新密码( 账号不存在会创建账号 )
1GRANT ALL PRIVILEGES ON *.* TO 'ddd'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;
撤销用户权限
1REVOKE ALL PRIVILEGES ON *.* FROM 'ddd'@'%';
使得更改生效
1FLUSH PRIVILEGES;
权限列表
1GRANT Alter, Alter Routine, Create, Create Routine, Create Temporary Tables, Create User, Create View, Delete, Drop, Event, Execute, File, Grant Option, Index, Insert, Lock Tables, Process, References, Reload, Replication Client, Replication Slav ...
回到序章来来来,点这
正文先实现验证码预期效果: 请求 URL,得到验证码图片 和 验证码字符串
12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394import java.awt.*;import java.awt.image.BufferedImage;import java.util.HashMap;import java.util.Map;import java.util.Random;/** * 验证码工具类 * * @author 青木恭 * @version 1.0 * @date 2021-04-01 */public class VerifyCodeUtil { // 定义图片的width private static final int wid ...
回到序章来来来,点这
正文引入依赖12345678910<!-- DB 支持 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId></dependency><dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope></dependency>
配置文件加入数据库信息这里创建一个空的库即可,JPA 会去生成表的。
1234567891011121314spring: datasource: url: jdbc:mysql:///db_test?useU ...
回到序章来来来,点这
Github 申请需要的东西
进入 Github-OAuthApp页面
点击 New OAuth App
填入需要的参数
点击 Register application
点击 Generate a new client secret
SpringBoot 程序代码导入需要的依赖包1234567891011121314<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId></dependency><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId></dependency>< ...
回到序章来来来,点这
认证异常( 401 )都是 AuthenticationException 的子类。错误码: 401
UsernameNotFoundException( 用户不存在 )
BadCredentialsException( 坏的凭据 )
CerdentialsExpiredException( 证书过期 )
DisableException( 账号冻结 )
LockedException( 账号锁定 )
等等…
实现 - 源码分析先出总结,主要的就是依次进入了下面四个方法:
AbstractAuthenticationProcessingFilter.doFilter()
AbstractAuthenticationProcessingFilter.unsuccessfulAuthentication()
SimpleUrlAuthenticationFailureHandler.onAuthenticationFailure()
SimpleUrlAuthenticationFailureHandler.saveException()
过滤器中捕捉异常
打 ...
回到序章来来来,点这
正文以 spring-security5 提供的默认表单登陆为例,其大概流程如下:
终端发起登陆请求
认证过滤器 UsernamePasswordAuthenticationFilter 拦截到请求,处理认证逻辑,在这里获得登陆信息,根据获得的登陆信息创建出未认证的 Authentication( 这里对应的是 UsernamePasswordAuthenticationToken 对象 ),然后将对象交给认证管理器
认证管理器循环所有的 AuthenticationProvider,找到对应的 provider 进行认证 3.1. 认证管理器 AuthenticationManager 维护着许多 AuthenticationProvider,这些 AuthenticationProvider 分别用来认证不同类型的请求,例如:表单、第三方 等
认证成功后,生成一个已认证的 Authentication,并将其通过 SecurityContextHolder.getContext().setAuthentication(authResult); 写到 Sec ...
回到序章来来来,点这
鸡粪人心的说一说还在为了明文密码而担心吗?还在吐槽着古老的 SHA 和 MD5 吗?还在担心更换加密方式后要大量更改系统吗?
嗯,活该。不过蛋定,继续看,下面提供一个方案。
正文
官方文档引一波
配置密码加密方式可以通过设置 .passwordEncoder() 实现,例如创建一个账号 user1 密码 123456,代码如下:
1234567891011@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception { auth // 存储在内存中 .inMemoryAuthentication() // 创建用户 user1 .withUser("user1").password("123456").authorities("admin") .a ...










