实验3:自定义登录数据参数
-
前面我们自定义了登录页面,在
form
表单中设置用户名、密码分别为username
,password
,那为什么这样写呢,可以改成别的嘛?可以倒是可以,但是不能随便改; -
如果这里我们把
username
改为name
,再次尝试登录,后端接口将报错:org.springframework.security.authentication.BadCredentialsException: Bad credentials
。。可是实际项目中我们的用户名密码就是不叫这个名字呢?我们可以进行配置.usernameParameter("name")
:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(“/user/add”).hasAuthority(“p1”)
.antMatchers(“/user/query”).hasAuthority(“p2”)
.antMatchers(“/user/**”).authenticated()
.anyRequest().permitAll() // Let other request pass
.and()
.csrf().disable() // turn off csrf, or will be 403 forbidden
.formLogin() // Support form and HTTPBasic
.loginPage(“/login”)
.loginProcessingUrl(“/formLogin”)
.usernameParameter(“name”);
}
用户名
密码
默认的用户名、密码分别为username
, password
,我们看下SpringSecurity的源码:
public final class FormLoginConfigurer<H extends HttpSecurityBuilder> extends
AbstractAuthenticationFilterConfigurer<H, FormLoginConfigurer, UsernamePasswordAuthenticationFilter> {
/**
-
Creates a new instance
-
@see HttpSecurity#formLogin()
*/
public FormLoginConfigurer() {
super(new UsernamePasswordAuthenticationFilter(), null);
usernameParameter(“username”);
passwordParameter(“password”);
}
}
实验4:自定义登录失败、成功处理器
问题:就以上个实验3中的报错信息为例,或当用户名、密码输错后,如何在后台看到错误信息?
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(“/user/add”).hasAuthority(“p1”)
.antMatchers(“/user/query”).hasAuthority(“p2”)
.antMatchers(“/user/**”).authenticated()
.anyRequest().permitAll() // Let other request pass
.and()
.csrf().disable() // turn off csrf, or will be 403 forbidden
.formLogin() // Support form and HTTPBasic
.loginPage(“/login”)
.loginProcessingUrl(“/formLogin”)
.usernameParameter(“name”)
.failureHandler(new AuthenticationFailureHandler(){
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
exception.printStackTrace();
request.getRequestDispatcher(request.getRequestURL().toString()).forward(request, response);
}
});
}
常见的认证异常,这里可以看到AuthenticationException
共有18个子类:
上述增加了在认证失败时的处理:输出错误信息。同理,如果想在登录成功时直接进行一些处理(eg: 数据初始化等),可以使用以下配置:
.successHandler(new AuthenticationSuccessHandler() {
@Override
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException {
System.out.println(“Login Successfully~”);
// do something here: initial work or forward to different url regarding different roles
…
request.getRequestDispatcher(“”).forward(request, response);
}
})
实验5:自定义登录成功跳转页面
经历千难万险,终于要登录成功了。进来之后要跳转到哪里呢?看你喽~想跳哪里跳哪里。。
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(“/user/add”).hasAuthority(“p1”)
.antMatchers(“/user/query”).hasAuthority(“p2”)
.antMatchers(“/user/**”).authenticated()
.anyRequest().permitAll() // Let other request pass
.and()
.csrf().disable() // turn off csrf, or will be 403 forbidden
.formLogin() // Support form and HTTPBasic
.loginPage(“/login”)
.loginProcessingUrl(“/formLogin”)
.usernameParameter(“name”)
.failureHandler(new AuthenticationFailureHandler(){
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
exception.printStackTrace();
request.getRequestDispatcher(request.getRequestURL().toString()).forward(request, response);
}
})
.successForwardUrl(“/ok”); // custom login success page, a POST request
}
@Controller
public class LoginController {
…
@PostMapping(value = “/ok”)
@ResponseBody
public String ok() {
return “ok”;
}
}
通过.successForwardUrl("/ok")
配置了登录成功之后要跳转的页面路径或接口,同时需要在后端新增/ok
接口。
Note:
-
注意这里
successForwardUrl
的接口必须为POST
接口; -
除了
.successForwardUrl("/ok");
,还可以使用.defaultSuccessUrl("/ok");
或者.defaultSuccessUrl("/ok", true);
第二个参数true
表示不管是从哪个地址进来,登录后全部跳转到指定的地址,此时与successForwardUrl
效果相同,默认为false
, -
当然,除了登录成功后的跳转,还有登录失败后的跳转:
failureForwardUrl
。
实验6:自定义退出接口
默认的退出接口是/logout
,可进行配置:
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(“/user/add”).hasAuthority(“p1”)
.antMatchers(“/user/query”).hasAuthority(“p2”)
.antMatchers(“/user/**”).authenticated()
.anyRequest().permitAll() // Let other request pass
.and()
.csrf().disable() // turn off csrf, or will be 403 forbidden
.formLogin() // Support form and HTTPBasic
.loginPage(“/login”)
.loginProcessingUrl(“/formLogin”)
.usernameParameter(“name”)
.failureHandler(new AuthenticationFailureHandler(){
@Override
public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
exception.printStackTrace();
request.getRequestDispatcher(request.getRequestURL().toString()).forward(request, response);
}
})
.successForwardUrl(“/ok”) // custom login success page, a POST request
.and()
.logout()
.logoutUrl(“/leave”);
}
上述配置将退出接口改为/leave
。在默认的退出过程中,还做了诸如清除认证信息和使Session失效等工作:
public class SecurityContextLogoutHandler implements LogoutHandler {
protected final Log logger = LogFactory.getLog(this.getClass());
private boolean invalidateHttpSession = true;
private boolean clearAuthentication = true;
// ~ Methods
// ==========================================
/**
-
Requires the request to be passed in.
-
@param request from which to obtain a HTTP session (cannot be null)
-
@param response not used (can be
null
) -
@param authentication not used (can be
null
)
*/
public void logout(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) {
Assert.notNull(request, “HttpServletRequest required”);
if (invalidateHttpSession) {
HttpSession session = request.getSession(false);
if (session != null) {
logger.debug("Invalidating session: " + session.getId());
session.invalidate();
}
}
if (clearAuthentication) {
SecurityContext context = SecurityContextHolder.getContext();
context.setAuthentication(null);
}
SecurityContextHolder.clearContext();
小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年最新Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
Kafka实战笔记
关于这份笔记,为了不影响大家的阅读体验,我只能在文章中展示部分的章节内容和核心截图
- Kafka入门
- 为什么选择Kafka
- Karka的安装、管理和配置
- Kafka的集群
- 第一个Kafka程序
afka的生产者
- Kafka的消费者
- 深入理解Kafka
- 可靠的数据传递
- Spring和Kalka的整合
- Sprinboot和Kafka的整合
- Kafka实战之削峰填谷
- 数据管道和流式处理(了解即可)
- Kafka实战之削峰填谷
Kafka的集群**
- 第一个Kafka程序
- [外链图片转存中…(img-s42hQuYu-1711128653753)]
afka的生产者
[外链图片转存中…(img-i42vySR9-1711128653753)]
- Kafka的消费者
- 深入理解Kafka
- 可靠的数据传递
[外链图片转存中…(img-l5VVtgt6-1711128653754)]
[外链图片转存中…(img-aGraGvgG-1711128653754)]
- Spring和Kalka的整合
- Sprinboot和Kafka的整合
- Kafka实战之削峰填谷
- 数据管道和流式处理(了解即可)
[外链图片转存中…(img-OBo0sxEQ-1711128653755)]
- Kafka实战之削峰填谷
[外链图片转存中…(img-Vkr5k99y-1711128653755)]