3-SpringSecurity:自定义Form表单,springcloud入门视频

文章详细介绍了如何在SpringSecurity中自定义登录页面的用户名和密码参数,以及如何配置登录失败和成功的处理器。还讨论了退出接口的定制,并提到了与Kafka的整合。
摘要由CSDN通过智能技术生成

实验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开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Java)
img

Kafka实战笔记

关于这份笔记,为了不影响大家的阅读体验,我只能在文章中展示部分的章节内容和核心截图

image.png

  • Kafka入门
  • 为什么选择Kafka
  • Karka的安装、管理和配置

image.png

  • Kafka的集群
  • 第一个Kafka程序
  • image.png

afka的生产者

image.png

  • Kafka的消费者
  • 深入理解Kafka
  • 可靠的数据传递

image.png

image.png

  • Spring和Kalka的整合
  • Sprinboot和Kafka的整合
  • Kafka实战之削峰填谷
  • 数据管道和流式处理(了解即可)

image.png

  • Kafka实战之削峰填谷

image.png

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)]

本文已被CODING开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码】收录

  • 27
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值