SpringSecurity认证的基本使用

目录

一、自定义登录页面

(1)自定义

(2)csrf防护

二、会话管理

三、认证成功后的处理方式

(1)自定义登陆成功处理器

(2)配置登陆成功处理器

四、认证失败后的处理方式

(1)自定义登录失败处理器

(2)配置登录失败处理器

五、退出登录

(1)配置类

(2)页面

六、自定义退出成功处理器

(1)自定义


一、自定义登录页面

(1)自定义

虽然Spring Security给我们提供了登录页面,但在实际项目中,更多的是使用自己的登录页面。Spring Security也支持用户自定义登录页面。用法如下:

@Configuration
public class SecurityConfig  extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //自定义表单登录
        http.formLogin()
                .loginPage("/login.html")//自定义登录页面
        .usernameParameter("username")//表单中的用户名项
        .passwordParameter("passord")//表单中的密码项
        .loginProcessingUrl("/login")//登陆路径,表单想该路径提交,提交后自动执行UserDetailsService的方法
        .successForwardUrl("/main")//登陆成功后跳转的路径
        .failureForwardUrl("/fail");//登录失败的路径
        
        //需要认证的资源
        http.authorizeRequests()
                .antMatchers("/login").permitAll()//登录页不需要认证
        .anyRequest().authenticated();//其余所有都需要认证
        
        //关闭csrf防护
        http.csrf().disable();
    }

    @Override
    public void configure(WebSecurity web) throws Exception {
        //静态资源放行
        web.ignoring().antMatchers("/css/**");
    }

    @Bean
    public PasswordEncoder passwordEncoder(){
        return NoOpPasswordEncoder.getInstance();
    }
}

(2)csrf防护

CSRF防护:

CSRF:跨站请求伪造,通过伪造用户请求访问受信任的站点从而进行非法请求访问,是一种攻击手段。 Spring Security为了防止CSRF攻击,默认开启了CSRF防护,这限制了除了GET请求以外的大多数方法。我们要想正常使用Spring Security需要突破CSRF防护。

二、会话管理

用户认证通过后,有时我们需要获取用户信息,比如在网站顶部显示:欢迎您,XXX。Spring Security将用户信息保存在会话中,并提供会话管理,我们可以从SecurityContext对象中获取用户信息,SecurityContext对象与当前线程进行绑定。

获取用户信息的写法如下:

@RestController
public class Controller1 {
    //获取当前用户的名字
    @RequestMapping("/users/username")
    public String getUserName(){
        //获取会话对象
        SecurityContext context= SecurityContextHolder.getContext();
        //获取认证催下
        Authentication authentication=context.getAuthentication();
        //获取登录用户的信息
        UserDetails userDetails=(UserDetails) authentication.getPrincipal();
        return userDetails.getUsername();
    }
}

三、认证成功后的处理方式

(1)自定义登陆成功处理器

public class LoginSuccessHandler implements AuthenticationSuccessHandler {
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        //拿到用户登录的信息
        UserDetails userDetails=(UserDetails) authentication.getPrincipal();
        System.out.println("用户名="+userDetails.getUsername());
        response.sendRedirect("/main");
    }
}

(2)配置登陆成功处理器

 http.formLogin()
                .loginPage("/login.html") // 自定义登录页面
                .usernameParameter("username") // 表单中的用户名项
                .passwordParameter("password") // 表单中的密码项
                .loginProcessingUrl("/login") // 登录路径,表单向该路径提交,提交后自动执行UserDetailsService的方法
                .successHandler(new LoginSuccessHandler())//登录成功后跳转的路径
                .failureForwardUrl("/fail"); //登录失败后跳转的路径

四、认证失败后的处理方式

(1)自定义登录失败处理器

public class LoginFailHandler implements AuthenticationFailureHandler {
    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
        System.out.println("登录失败");
        response.sendRedirect("/fail");
        System.out.println("5555555555555555");
    }
}

(2)配置登录失败处理器

      http.formLogin()
                .loginPage("/login.html") // 自定义登录页面
                .usernameParameter("username") // 表单中的用户名项
                .passwordParameter("password") // 表单中的密码项
                .loginProcessingUrl("/login") // 登录路径,表单向该路径提交,提交后自动执行UserDetailsService的方法
                .successHandler(new LoginSuccessHandler())//登录成功后跳转的路径
                .failureHandler(new LoginFailHandler()); //登录失败后跳转的路径


        // 需要认证的资源
        http.authorizeRequests()
                .antMatchers("/login.html").permitAll() //登录页不需要认证
                .antMatchers("/fail").permitAll()
                .anyRequest().authenticated(); //其余所有请求都需要认证

五、退出登录

(1)配置类

 // 退出登录配置
        http.logout()
                .logoutUrl("/logout") // 退出登录路径
                .logoutSuccessUrl("/login.html") // 退出登录后跳转的路径
                .clearAuthentication(true) //清除认证状态,默认为true
                .invalidateHttpSession(true); // 销毁HttpSession对象,默认为true

(2)页面




  
  主页面


主页面

退出登录

六、自定义退出成功处理器

(1)自定义

public class LogoutSuccessHandler implements org.springframework.security.web.authentication.logout.LogoutSuccessHandler {
    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
        System.out.println("成功跑掉了");
        response.sendRedirect("/login.html");
    }
}
// 退出登录配置
        http.logout()
                .logoutUrl("/logout") // 退出登录路径
                .clearAuthentication(true) //清除认证状态,默认为true
                .invalidateHttpSession(true) // 销毁HttpSession对象,默认为true
                .logoutSuccessHandler(new LogoutSuccessHandler());

你可能感兴趣的:(认证和授权,spring)