java自定义登录_JavaWeb-SpringSecurity自定义登陆页面

系列博文

项目已上传至guthub  传送门

JavaWeb-SpringSecurity初认识  传送门

JavaWeb-SpringSecurity在数据库中查询登陆用户  传送门

JavaWeb-SpringSecurity自定义登陆页面  传送门

JavaWeb-SpringSecurity实现需求-判断请求是否以html结尾  传送门

JavaWeb-SpringSecurity自定义登陆配置  传送门

JavaWeb-SpringSecurity图片验证ImageCode  传送门

JavaWeb-SpringSecurity记住我功能  传送门

JavaWeb-SpringSecurity使用短信验证码登陆  传送门

在static文件夹下添加一个login.html,作为自定义登陆页面

48e9be9d1acff3f02fec5f20cb7e3d5a.png

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Insert title here

Gary登陆页面

用户名:


密码:

login.html

在SecurityConfig.java中的configure()方法中配置表单校验,添加一个自定义跳转的页面路径/login.html

protected void configure(HttpSecurity http) throwsException{//表单验证(身份认证)

http.formLogin()//自定义登陆页面

.loginPage("/login.html")

.and()//请求授权

.authorizeRequests()//所有请求都被拦截,跳转到(/login请求中)

.anyRequest()//都需要我们身份认证

.authenticated();

}

运行程序,发现页面进入死循环,提示错误页面包含的重定义过多了

原因:用户想要进入我们自定义的登陆页面,需要SpringSecurity进行身份认证->但用户要通过SpringSecurity,就会跳转到我们自定义的登陆页面->用户进入我们自定义的登陆页面,就需要SpringSecurity进行身份认证...

无限死循环了!!!

1c14d88d1651d510374531afd43c1734.png

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.Gary.GaryRESTful.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.config.annotation.web.builders.HttpSecurity;importorg.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;importorg.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;importorg.springframework.security.crypto.password.PasswordEncoder;//Web应用安全适配器

@Configurationpublic class SecurityConfig extendsWebSecurityConfigurerAdapter{//告诉SpringSecurity密码用什么加密的

@BeanpublicPasswordEncoder passwordEncoder()

{return newBCryptPasswordEncoder();

}protected void configure(HttpSecurity http) throwsException{//表单验证(身份认证)

http.formLogin()//自定义登陆页面

.loginPage("/login.html")

.and()//请求授权

.authorizeRequests()//所有请求都被拦截,跳转到(/login请求中)

.anyRequest()//都需要我们身份认证

.authenticated();

}

}

SecurityConfig.java

所以我们在配置SecurityConfig.java中的configure()时,对路径/login.html进行请求放行

protected void configure(HttpSecurity http) throwsException{//表单验证(身份认证)

http.formLogin()//自定义登陆页面

.loginPage("/login.html")

.and()//请求授权

.authorizeRequests()//在访问我们的URL时,我们是不需要省份认证,可以立即访问

.antMatchers("/login.html").permitAll()//所有请求都被拦截,跳转到(/login请求中)

.anyRequest()//都需要我们身份认证

.authenticated();

}

此时,我们再访问login.html时,发现就可以进入到我们自定义的登陆页面了

777e9032ec5425cc39ecf861fc74782b.png

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.Gary.GaryRESTful.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.config.annotation.web.builders.HttpSecurity;importorg.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;importorg.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;importorg.springframework.security.crypto.password.PasswordEncoder;//Web应用安全适配器

@Configurationpublic class SecurityConfig extendsWebSecurityConfigurerAdapter{//告诉SpringSecurity密码用什么加密的

@BeanpublicPasswordEncoder passwordEncoder()

{return newBCryptPasswordEncoder();

}protected void configure(HttpSecurity http) throwsException{//表单验证(身份认证)

http.formLogin()//自定义登陆页面

.loginPage("/login.html")

.and()//请求授权

.authorizeRequests()//在访问我们的URL时,我们是不需要省份认证,可以立即访问

.antMatchers("/login.html").permitAll()//所有请求都被拦截,跳转到(/login请求中)

.anyRequest()//都需要我们身份认证

.authenticated();

}

}

SecurityConfig.java

此时,我们在自己的页面中输入数据库中账号密码,页面的拦截器都不会生效

这是因为login.html中表单/loginPage请求路径拦截器不认识

按住Ctrl+Shift+T,可以找到SpringSecurity拦截器中UsernamePasswordAuthenticationFilter的方法

public class UsernamePasswordAuthenticationFilter extendsAbstractAuthenticationProcessingFilter {//~ Static fields/initializers//=====================================================================================

public static final String SPRING_SECURITY_FORM_USERNAME_KEY = "username";public static final String SPRING_SECURITY_FORM_PASSWORD_KEY = "password";private String usernameParameter =SPRING_SECURITY_FORM_USERNAME_KEY;private String passwordParameter =SPRING_SECURITY_FORM_PASSWORD_KEY;private boolean postOnly = true;//~ Constructors//===================================================================================================

publicUsernamePasswordAuthenticationFilter() {super(new AntPathRequestMatcher("/login", "POST"));

}

现在需要我们login.html中的表单发送请求访问SpringSecurity拦截器中的UsernamePasswordAuthenticationFilter()这个方法,处理用户登陆的请求

(如果要使用UsernamePasswordAuthenticationFilter()这个方法处理用户登陆,一定需要在配置表单登陆时,添加一个csrf跨站请求伪造的防护)

protected void configure(HttpSecurity http) throwsException{//表单验证(身份认证)

http.formLogin()//自定义登陆页面

.loginPage("/login.html")//如果URL为loginPage,则用SpringSecurity中自带的过滤器去处理该请求

.loginProcessingUrl("/loginPage")

.and()//请求授权

.authorizeRequests()//在访问我们的URL时,我们是不需要省份认证,可以立即访问

.antMatchers("/login.html").permitAll()//所有请求都被拦截,跳转到(/login请求中)

.anyRequest()//都需要我们身份认证

.authenticated()//SpringSecurity保护机制

.and().csrf().disable();

}

1ac3c3659852caf14ab41b5ae2e1fc81.gif

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

Insert title here

Gary登陆页面

用户名:


密码:

login.html

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

packagecom.Gary.GaryRESTful.config;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.security.config.annotation.web.builders.HttpSecurity;importorg.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;importorg.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;importorg.springframework.security.crypto.password.PasswordEncoder;//Web应用安全适配器

@Configurationpublic class SecurityConfig extendsWebSecurityConfigurerAdapter{//告诉SpringSecurity密码用什么加密的

@BeanpublicPasswordEncoder passwordEncoder()

{return newBCryptPasswordEncoder();

}protected void configure(HttpSecurity http) throwsException{//表单验证(身份认证)

http.formLogin()//自定义登陆页面

.loginPage("/login.html")//如果URL为loginPage,则用SpringSecurity中自带的过滤器去处理该请求

.loginProcessingUrl("/loginPage")

.and()//请求授权

.authorizeRequests()//在访问我们的URL时,我们是不需要省份认证,可以立即访问

.antMatchers("/login.html").permitAll()//所有请求都被拦截,跳转到(/login请求中)

.anyRequest()//都需要我们身份认证

.authenticated()//SpringSecurity保护机制

.and().csrf().disable();

}

}

SecurityConfig.java

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值