JavaWeb-SpringSecurity自定义登录页面

 

 

  系列博文html

  项目已上传至guthub  传送门java

  JavaWeb-SpringSecurity初认识  传送门git

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

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

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

  JavaWeb-SpringSecurity自定义登录配置  传送门数据库

  JavaWeb-SpringSecurity图片验证ImageCode  传送门安全

  JavaWeb-SpringSecurity记住我功能  传送门ide

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

 

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

  

 

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>Gary登录页面</h1>
    <form action="/loginPage" method="post"> 用户名: <input type="text" name="username">
        <br> 密码: <input type="password" name="password">
        <br>
        <input type="submit">
    
    </form>

</body>
</html>
login.html

 

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

protected void configure(HttpSecurity http) throws Exception{ //表单验证(身份认证)
 http.formLogin() //自定义登录页面
            .loginPage("/login.html") .and() //请求受权
 .authorizeRequests() //全部请求都被拦截,跳转到(/login请求中)
 .anyRequest() //都须要咱们身份认证
 .authenticated(); }

 

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

  缘由:用户想要进入咱们自定义的登录页面,须要SpringSecurity进行身份认证->但用户要经过SpringSecurity,就会跳转到咱们自定义的登录页面->用户进入咱们自定义的登录页面,就须要SpringSecurity进行身份认证...

  无限死循环了!!!

 

 

 

package com.Gary.GaryRESTful.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; //Web应用安全适配器
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter{ //告诉SpringSecurity密码用什么加密的
 @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } protected void configure(HttpSecurity http) throws Exception{ //表单验证(身份认证)
 http.formLogin() //自定义登录页面
            .loginPage("/login.html") .and() //请求受权
 .authorizeRequests() //全部请求都被拦截,跳转到(/login请求中)
 .anyRequest() //都须要咱们身份认证
 .authenticated(); } }
SecurityConfig.java

 

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

protected void configure(HttpSecurity http) throws Exception{ //表单验证(身份认证)
 http.formLogin() //自定义登录页面
            .loginPage("/login.html") .and() //请求受权
 .authorizeRequests() //在访问咱们的URL时,咱们是不须要省份认证,能够当即访问
            .antMatchers("/login.html").permitAll() //全部请求都被拦截,跳转到(/login请求中)
 .anyRequest() //都须要咱们身份认证
 .authenticated(); }

 

  此时,咱们再访问login.html时,发现就能够进入到咱们自定义的登录页面了

 

 

 

package com.Gary.GaryRESTful.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; //Web应用安全适配器
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter{ //告诉SpringSecurity密码用什么加密的
 @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } protected void configure(HttpSecurity http) throws Exception{ //表单验证(身份认证)
 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 extends AbstractAuthenticationProcessingFilter { // ~ 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 // ===================================================================================================

    public UsernamePasswordAuthenticationFilter() { super(new AntPathRequestMatcher("/login", "POST")); }

 

  如今须要咱们login.html中的表单发送请求访问SpringSecurity拦截器中的UsernamePasswordAuthenticationFilter()这个方法,处理用户登录的请求

  (若是要使用UsernamePasswordAuthenticationFilter()这个方法处理用户登录,必定须要在配置表单登录时,添加一个csrf跨站请求伪造的防御)

protected void configure(HttpSecurity http) throws Exception{ //表单验证(身份认证)
 http.formLogin() //自定义登录页面
            .loginPage("/login.html") //若是URL为loginPage,则用SpringSecurity中自带的过滤器去处理该请求
            .loginProcessingUrl("/loginPage") .and() //请求受权
 .authorizeRequests() //在访问咱们的URL时,咱们是不须要省份认证,能够当即访问
            .antMatchers("/login.html").permitAll() //全部请求都被拦截,跳转到(/login请求中)
 .anyRequest() //都须要咱们身份认证
 .authenticated() //SpringSecurity保护机制
 .and().csrf().disable(); }

 

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<h1>Gary登录页面</h1>
    <form action="/loginPage" method="post"> 用户名: <input type="text" name="username">
        <br> 密码: <input type="password" name="password">
        <br>
        <input type="submit">
    
    </form>

</body>
</html>
login.html

 

package com.Gary.GaryRESTful.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; //Web应用安全适配器
@Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter{ //告诉SpringSecurity密码用什么加密的
 @Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); } protected void configure(HttpSecurity http) throws Exception{ //表单验证(身份认证)
 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
相关文章
相关标签/搜索