SpringSecurity个性化用户认证流程
⒈自定义登录页面
- package cn.coreqi.security.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.password.NoOpPasswordEncoder;
- import org.springframework.security.crypto.password.PasswordEncoder;
- @Configuration
- public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
- @Bean
- public PasswordEncoder passwordEncoder(){
- return NoOpPasswordEncoder.getInstance();
- }
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- //http.httpBasic() //httpBasic登录 BasicAuthenticationFilter
- http.formLogin() //表单登录 UsernamePasswordAuthenticationFilter
- //.loginPage("/coreqi-signIn.html") //指定登录页面
- .loginPage("/authentication/require")
- .loginProcessingUrl("/authentication/form") //指定表单提交的地址用于替换UsernamePasswordAuthenticationFilter默认的提交地址
- .and()
- .authorizeRequests() //对授权请求进行配置
- .antMatchers("/coreqi-signIn.html").permitAll() //指定登录页面不需要身份认证
- .anyRequest().authenticated() //任何请求都需要身份认证
- .and().csrf().disable(); //禁用CSRF
- //FilterSecurityInterceptor 整个SpringSecurity过滤器链的最后一环
- }
- }
- package cn.coreqi.security.controller;
- import cn.coreqi.security.support.SimpleResponse;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.http.HttpStatus;
- import org.springframework.security.web.DefaultRedirectStrategy;
- import org.springframework.security.web.RedirectStrategy;
- import org.springframework.security.web.savedrequest.HttpSessionRequestCache;
- import org.springframework.security.web.savedrequest.RequestCache;
- import org.springframework.security.web.savedrequest.SavedRequest;
- import org.springframework.util.StringUtils;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.ResponseStatus;
- import org.springframework.web.bind.annotation.RestController;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- @RestController
- public class SecurityController {
- private Logger logger = LoggerFactory.getLogger(getClass());
- //拿到引发跳转的请求
- private RequestCache requestCache = new HttpSessionRequestCache(); //SpringSecurity执行身份认证跳转之前会将当前的请求缓存到HttpSessionRequestCache中
- //我们可以通过HttpSessionRequestCache把之前缓存的请求拿出来。
- private RedirectStrategy redirectStrategy = new DefaultRedirectStrategy(); //Spring用于跳转的工具
- /**
- * 当需要身份认证时,跳转到这里
- * @param request
- * @param response
- * @return
- */
- @GetMapping("/authentication/require")
- @ResponseStatus(code = HttpStatus.UNAUTHORIZED) //返回401状态码
- public SimpleResponse requireAuthentication(HttpServletRequest request, HttpServletResponse response) throws IOException {
- SavedRequest savedRequest = requestCache.getRequest(request,response); //SavedRequest就是跳转前的请求
- if(savedRequest != null){ //如果请求缓存存在的话
- String target = savedRequest.getRedirectUrl(); //拿到引发跳转的请求URL
- logger.info("引发跳转的请求URL是:" + target);
- if(StringUtils.endsWithIgnoreCase(target,".html")){ //引发跳转的请求URL是否以html结尾
- redirectStrategy.sendRedirect(request,response,"/coreqi-signIn.html"); //将请求跳转到指定的Url
- }
- }
- return new SimpleResponse(401,"访问的服务需要身份认证,请引导用户到登陆页面",null);
- }
- }
⒉自定义登录成功处理
默认情况下SpringSecurity登录成功了将会跳转到之前引发登录的那个请求上去,如果我们需要自定义登录成功后的处理过程,只需要实现AuthenticationSuccessHandler接口。(SpringSecurity默认的成功处理器是SavedRequestAwareAuthenticationSuccessHandler)
- package cn.coreqi.security.authentication;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.security.core.Authentication;
- import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
- import org.springframework.stereotype.Component;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- @Component("coreqiAuthenticationSuccessHandler")
- public class CoreqiAuthenticationSuccessHandler implements AuthenticationSuccessHandler {
- private Logger logger = LoggerFactory.getLogger(getClass());
- @Autowired
- private ObjectMapper objectMapper; //将对象转换为Json的工具类,SpringMVC在启动的时候会自动为我们注册ObjectMapper
- /**
- *
- * @param httpServletRequest 不知道
- * @param httpServletResponse 不知道
- * @param authentication Authentication接口是SpringSecurity的一个核心接口,它的作用是封装我们的认证信息,包含认证请求中的一些信息,包括认证请求的ip,Session是什么,以及认证用户的信息等等。
- * @throws IOException
- * @throws ServletException
- */
- @Override
- public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
- logger.info("登录成功");
- httpServletResponse.setContentType("application/json;charset=UTF-8");
- httpServletResponse.getWriter().write(objectMapper.writeValueAsString(authentication));
- }
- }
配置
- package cn.coreqi.security.config;
- import org.springframework.beans.factory.annotation.Autowired;
- 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.password.NoOpPasswordEncoder;
- import org.springframework.security.crypto.password.PasswordEncoder;
- import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
- @Configuration
- public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
- @Autowired
- private AuthenticationSuccessHandler coreqiAuthenticationSuccessHandler;
- @Bean
- public PasswordEncoder passwordEncoder(){
- return NoOpPasswordEncoder.getInstance();
- }
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- //http.httpBasic() //httpBasic登录 BasicAuthenticationFilter
- http.formLogin() //表单登录 UsernamePasswordAuthenticationFilter
- //.loginPage("/coreqi-signIn.html") //指定登录页面
- .loginPage("/authentication/require")
- .loginProcessingUrl("/authentication/form") //指定表单提交的地址用于替换UsernamePasswordAuthenticationFilter默认的提交地址
- .successHandler(coreqiAuthenticationSuccessHandler) //登录成功以后要用我们自定义的登录成功处理器,不用Spring默认的。
- .and()
- .authorizeRequests() //对授权请求进行配置
- .antMatchers("/coreqi-signIn.html").permitAll() //指定登录页面不需要身份认证
- .anyRequest().authenticated() //任何请求都需要身份认证
- .and().csrf().disable(); //禁用CSRF
- //FilterSecurityInterceptor 整个SpringSecurity过滤器链的最后一环
- }
- }
⒊自定义登录失败处理
只需要实现AuthenticationSuccessHandler接口即可。(默认为SimpleUrlAuthenticationFailureHandler)
- package cn.coreqi.security.authentication;
- import com.fasterxml.jackson.databind.ObjectMapper;
- import org.slf4j.Logger;
- import org.slf4j.LoggerFactory;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.http.HttpStatus;
- import org.springframework.security.core.AuthenticationException;
- import org.springframework.security.web.authentication.AuthenticationFailureHandler;
- import org.springframework.stereotype.Component;
- import javax.servlet.ServletException;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.io.IOException;
- @Component("coreqiAuthenticationFailureHandler")
- public class CoreqiAuthenticationFailureHandler implements AuthenticationFailureHandler {
- private Logger logger = LoggerFactory.getLogger(getClass());
- @Autowired
- private ObjectMapper objectMapper; //将对象转换为Json的工具类,SpringMVC在启动的时候会自动为我们注册ObjectMapper
- /**
- *
- * @param httpServletRequest 不知道
- * @param httpServletResponse 不知道
- * @param e AuthenticationException对象包含了在认证过程中发生的错误产生的异常
- * @throws IOException
- * @throws ServletException
- */
- @Override
- public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException {
- logger.info("登录失败");
- httpServletResponse.setStatus(HttpStatus.INTERNAL_SERVER_ERROR.value()); //500状态码
- httpServletResponse.setContentType("application/json;charset=UTF-8");
- httpServletResponse.getWriter().write(objectMapper.writeValueAsString(e));
- }
- }
配置
- package cn.coreqi.security.config;
- import org.springframework.beans.factory.annotation.Autowired;
- 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.password.NoOpPasswordEncoder;
- import org.springframework.security.crypto.password.PasswordEncoder;
- import org.springframework.security.web.authentication.AuthenticationFailureHandler;
- import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
- @Configuration
- public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
- @Autowired
- private AuthenticationSuccessHandler coreqiAuthenticationSuccessHandler;
- @Autowired
- private AuthenticationFailureHandler coreqiAuthenticationFailureHandler;
- @Bean
- public PasswordEncoder passwordEncoder(){
- return NoOpPasswordEncoder.getInstance();
- }
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- //http.httpBasic() //httpBasic登录 BasicAuthenticationFilter
- http.formLogin() //表单登录 UsernamePasswordAuthenticationFilter
- //.loginPage("/coreqi-signIn.html") //指定登录页面
- .loginPage("/authentication/require")
- .loginProcessingUrl("/authentication/form") //指定表单提交的地址用于替换UsernamePasswordAuthenticationFilter默认的提交地址
- .successHandler(coreqiAuthenticationSuccessHandler) //登录成功以后要用我们自定义的登录成功处理器,不用Spring默认的。
- .failureHandler(coreqiAuthenticationFailureHandler) //自己体会把
- .and()
- .authorizeRequests() //对授权请求进行配置
- .antMatchers("/coreqi-signIn.html").permitAll() //指定登录页面不需要身份认证
- .anyRequest().authenticated() //任何请求都需要身份认证
- .and().csrf().disable(); //禁用CSRF
- //FilterSecurityInterceptor 整个SpringSecurity过滤器链的最后一环
- }
- }
SpringSecurity个性化用户认证流程的更多相关文章
- 阶段5 3.微服务项目【学成在线】_day17 用户认证 Zuul_01-用户认证-用户认证流程分析
1 用户认证 1.1 用户认证流程分析 用户认证流程如下: 访问下面的资源需要携带身份令牌和jwt令牌,客户端可以通过身份认证的令牌从服务端拿到长令牌, 一会要实现认证服务请求用户中心从数据库内来查询 ...
- SpringSecurity自定义用户认证逻辑
⒈处理用户信息获取逻辑 用户信息的获取逻辑是被SpringSecurity封装到UserDetailsService接口里面的 package org.springframework.security ...
- 02 spring security 自定义用户认证流程
1. 自定义登录页面 (1)首先在static目录下面创建login.html 注意: springboot项目默认可以访问resources/resources, resources/s ...
- Spring Security构建Rest服务-0701-个性化用户认证流程
上一篇说了用户认证的基本流程,但是上一篇当访问一个受保护的服务后,如果未认证会调到默认的登录页面,这样是不行的,而且认证成功后,就直接访问了那个服务,如果想要做认证成功后做一些操作,还需要自定义. 个 ...
- SpringSecurity认证流程详解
SpringSecurity基本原理 在之前的文章<SpringBoot + Spring Security 基本使用及个性化登录配置>中对SpringSecurity进行了简单的使用介绍 ...
- springSecurity + jwt + redis 前后端分离用户认证和授权
记录一下使用springSecurity搭建用户认证和授权的代码... 技术栈使用springSecurity + redis + JWT + mybatisPlus 部分代码来自:https://b ...
- Spring Security教程(八):用户认证流程源码详解
本篇文章主要围绕下面几个问题来深入源码: 用户认证流程 认证结果如何在多个请求之间共享 获取认证用户信息 一.用户认证流程 上节中提到Spring Security核心就是一系列的过滤器链,当一个请求 ...
- REST Framework 的用户认证组件
用户认证流程: 我们要知道这个流程是怎么走的? 认证之后做的什么? 怎么认证?这三个条件 认证流程:就是使用BaseAuthentication这个模块来做认证,判断你登陆成功传递过来的随机字符串是否 ...
- nginx 请求文件 进行用户认证/鉴权: internal(限制为内部调用)
在进行WEB开发时, 必然会遇到向用户返回文件的场景(如图片, 文档等等), 当返回的文件较小时, 我们可以直接通过接口以数据流的形式向前台返回, 因为文件较小, 因此也不会太过于影响响应速度及服务器 ...
随机推荐
- bzoj1003 最短路+dp
遇到小范围数据的题目就容易被限制了思维,我单知道数据小可以跑很多遍最短路,但我没想到暴力跑N ^ 2的最短路也能过 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输 ...
- css3 实现波浪(wave)效果
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Kafka技术内幕 读书笔记之(一) Kafka入门
在0.10版本之前, Kafka仅仅作为一个消息系统,主要用来解决应用解耦. 异步消息 . 流量削峰等问题. 在0.10版本之后, Kafka提供了连接器与流处理的能力,它也从分布式的消息系统逐渐成为 ...
- Linux记录-定时crontab
/etc/crontab文件和crontab -e命令区别 1.格式不同 分 时 日 月 星期 要运行的命令 第1列分钟1-59 第2列小时1-23(0表示子夜) 第3列日1-31 第4列月1-12 ...
- Redis_集群_主从模式_哨兵模式
1.主从模式 2.哨兵模式
- Linux 内核里的数据结构:双向链表
原文:https://blog.csdn.net/qq_33487044/article/details/78827260 双向链表 Linux 内核自己实现了双向链表,可以在 include/lin ...
- swagger使用一新手篇
本文转自:http://javatech.wang/index.php/archives/74/ 先简单介绍下项目环境: JDK1.7 Spring 3.2.2 swagger-springmvc 1 ...
- Spark源码剖析 - SparkContext的初始化(八)_初始化管理器BlockManager
8.初始化管理器BlockManager 无论是Spark的初始化阶段还是任务提交.执行阶段,始终离不开存储体系.Spark为了避免Hadoop读写磁盘的I/O操作成为性能瓶颈,优先将配置信息.计算结 ...
- http.lua里的装饰器
摘自:http.lua local co_yield = coroutine.yield local co_create = coroutine.create local co_status = co ...
- MySQL 数据库应用程序编程
普通用户使用客户端应用程序(Client Application)和服务器程序(Server Application)通信以取得服务, 而服务器程序通常要和数据库服务器通信以取得数据存取服务, 这时就 ...