默认自定义配置

一、自定义成功处理器

使用继承SavedRequestAwareAuthenticationSuccessHandler类的方式?因为SavedRequestAwareAuthenticationSuccessHandler这个类记住了你上一次的请求路径,比如:你请求user.html。然后被拦截到了登录页,这时候你输入完用户名密码点击登录,会自动跳转到user.html,而不是主页面。
public class CoreAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
   private Logger logger = LoggerFactory.getLogger(getClass());
	@Autowired
	private ObjectMapper objectMapper;
	@Autowired
	private SecurityProperties securityProperties;
	private RequestCache requestCache = new HttpSessionRequestCache();
	 * (non-Javadoc)
	 * @see org.springframework.security.web.authentication.
	 * AuthenticationSuccessHandler#onAuthenticationSuccess(javax.servlet.http.
	 * HttpServletRequest, javax.servlet.http.HttpServletResponse,
	 * org.springframework.security.core.Authentication)
	@Override
	public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response,
			Authentication authentication) throws IOException, ServletException {
		logger.info("登录成功");
		if (LoginResponseType.JSON.equals(securityProperties.getBrowser().getSignInResponseType())) {
			response.setContentType("application/json;charset=UTF-8");
			String type = authentication.getClass().getSimpleName();
			response.getWriter().write(objectMapper.writeValueAsString(new SimpleResponse(type)));
		} else {
			// 如果设置了singInSuccessUrl,总是跳到设置的地址上
			// 如果没设置,则尝试跳转到登录之前访问的地址上,如果登录前访问地址为空,则跳到网站根路径上
			if (StringUtils.isNotBlank(securityProperties.getBrowser().getSingInSuccessUrl())) {
				requestCache.removeRequest(request, response);
				setAlwaysUseDefaultTargetUrl(true);
				setDefaultTargetUrl(securityProperties.getBrowser().getSingInSuccessUrl());
			super.onAuthenticationSuccess(request, response, authentication);

二、自定义失败处理器

public class CoreAuthenctiationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
	private Logger logger = LoggerFactory.getLogger(getClass());
	@Autowired
	private ObjectMapper objectMapper;
	@Autowired
	private SecurityProperties securityProperties;
	/* (non-Javadoc)
	 * @see org.springframework.security.web.authentication.AuthenticationFailureHandler#onAuthenticationFailure(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse, org.springframework.security.core.AuthenticationException)
	@Override
	public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response,
			AuthenticationException exception) throws IOException, ServletException {
		logger.info("登录失败");
		if (LoginResponseType.JSON.equals(securityProperties.getBrowser().getSignInResponseType())) {
			response.setStatus(HttpStatus.UNAUTHORIZED.value());
			response.setContentType("application/json;charset=UTF-8");
			response.getWriter().write(objectMapper.writeValueAsString(new SimpleResponse(exception.getMessage())));
		}else{
			super.onAuthenticationFailure(request, response, exception);

三、处理成功/失败的配置类

@Configuration
public class CoreAuthenticationHandlerConfig {
     * 成功处理器
     * @return
    @Bean
    @ConditionalOnMissingBean(name = "authenticationSuccessHandler")
    public AuthenticationSuccessHandler authenticationSuccessHandler() {
        return new CoreAuthenticationSuccessHandler();
     * 失败处理器
     * @return
    @Bean
    @ConditionalOnMissingBean(name = "authenticationFailureHandler")
    public AuthenticationFailureHandler authenticationFailureHandler() {
        return new CoreAuthenticationFailureHandler();

四、安全核心配置

@ConditionalOnProperty(prefix = "security.core.config", value = "enable", matchIfMissing = true)
@Configuration
public class ValidateSecurityCoreConfig extends WebSecurityConfigurerAdapter {
     * 失败处理器
    @Autowired
    AuthenticationFailureHandler authenticationFailureHandler;
     * 成功处理器
    @Autowired
    AuthenticationSuccessHandler authenticationSuccessHandler;
    @Autowired
    private AuthorizeConfigManager authorizeConfigManager;
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.formLogin()
            .loginPage(ValidateCodeConstants.DEFAULT_UNAUTHENTICATION_URL)
            .loginProcessingUrl(DefaultLoginProcessingUrlEnum.FORM.url())
            .successHandler(authenticationSuccessHandler)
            .failureHandler(authenticationFailureHandler)
            .and()
            // 先加上这句话,否则登录的时候会出现403错误码,Could not verify the provided CSRF token because your session was not found.
            .csrf().disable();

如果不使用上述默认定义的登录成功/失败处理,还可进行扩展,代码如下

public class AppAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Override
    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException {
        String username = ((UserDetails) authentication.getPrincipal()).getUsername();
        logger.info("username:【{}】", username);
        logger.info("登录成功!");
        // 生成token
        final String token = '生成token';
        // 存到redis
        response.setHeader("Authorization", "Bearer " + token);
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().write(JSON.toJSONString(new ResponseEntity(HttpStatus.OK.value(), HttpStatus.OK.getReasonPhrase()).data(authentication)));
public class AppAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler {
    private Logger logger = LoggerFactory.getLogger(getClass());
    @Override
    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
        logger.info("登录失败!");
        response.setContentType("application/json;charset=UTF-8");
        response.getWriter().write(JSON.toJSONString(new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR.value(), exception.getMessage()).data(null)));
@Configuration
public class AppAuthenticationHandlerConfig {
    @Bean(name = "authenticationSuccessHandler")
    @ConditionalOnProperty(prefix = "security.app.success.handler", name = "enable", matchIfMissing = true)
    public AuthenticationSuccessHandler authenticationSuccessHandler() {
       return new AppAuthenticationSuccessHandler();
    @Bean(name = "authenticationFailureHandler")
    @ConditionalOnProperty(prefix = "security.app.failure.handler", name = "enable", matchIfMissing = true)
    public AuthenticationFailureHandler authenticationFailureHandler() {
        return new AppAuthenticationFailureHandler();
				
spring boot 中用security 遇到的问题 如果项目中用了 security ,而不用 security 自带的登入的话 ,会自动跳转其自带的登入界面(前提是已拦截 放开的可以直接访问),/login 自带登入接口路径 ,/logout 自带退出接口路劲。 1.自定义拦截 @Configuration @EnableWebSecurity public class WebSecur...
spring security 默认情况下登录成功会跳转到引发登录的请求上去,但是有些登录并不是同步访问的,而是ajax异步请求来访问登录,那么前端希望拿到的是登录用户的用户信息。 二、自定义登录成功登录失败的返回方式 在/src/main/resources的resources目录新建index.html: <!DOCTYPE html> <html>...
登录成功后我们需要实现AuthenticationSuccessHandler接口来处理我们的逻辑。当然可以继承它的实现类SavedRequestAwareAuthenticationSuccessHandler。 登录失败后我们需要实现AuthenticationFailureHandler接口来处理我们的逻辑。当然可以继承它的实现类SimpleUrlAuthenticationFailureH...
首先介绍一下spring-security的配置应该怎么写: 重写WebSecurityConfigurerAdapter类中的方法,最基本的是重写configure(HttpSecurity httpSecurity)方法。(具体代码往下看) 第一步,自定义一个登录页面: package com.eknown.config; import org.springframework.beans....
前面写的那个不小心删除了,现在补充下,就没那么多废话了和截图了。 问题描述: 根据前面一篇文章,登录进去系统后,继续访问接口,提示匿名用户访问,即没有登录,将Authentication里的信息,打印出来发现sessionId一直是null。 主要原因是vue发送请求默认不携带cookie,所以服务器端获取的sessionId为null,导致下次每次请求都是新的请求,所以会显示匿名用户访问。 解决方案就是,设置vue请求携带cookie就行啦 在main.js 中添加 axios.defaults.with
@Component("MyAuthenticationFailureHandler") public class MyAuthenticationFailureHandler implements AuthenticationFailureHandler { protected Logger logge...
实现一个简单的使用spring security完成的登录验证。登录成功后,自动跳转到index页面。不同的用户,授予不同访问页面路径的权限。权限基于角色管控。admin权限角色最高。user角色为普通角色。 import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.authentication.builders.Authentica
俄罗斯方块(Tetris)是一款经典的益智游戏,由俄罗斯程序员阿列克谢·帕基特诺夫于1984年开发。游戏的主要目标是通过旋转和移动不同形状的方块(称为“砖块”或“Tetrominoes”),将它们填充到屏幕底部的水平行中。当一行被完全填满时,该行会消失,玩家将获得积分。 游戏特点: 砖块形状:游戏中有七种不同形状的砖块,每种砖块由四个方块组成。 下落机制:砖块从屏幕顶部逐渐下落,玩家需要快速做出决策。 得分系统:消除的行越多,得分越高,连续消除多行会获得额外分数。 难度递增:随着游戏进行,砖块下落的速度会逐渐加快,增加了游戏的挑战性。 文化影响: 俄罗斯方块不仅在游戏界取得了巨大的成功,还成为了流行文化的一部分,影响了许多后续的游戏设计。它的简单性和上瘾性使其成为了历史上最畅销的电子游戏之一。 版本与平台: 自发布以来,俄罗斯方块已经在多个平台上推出,包括家用游戏机、电脑、手机等,形成了众多不同的版本和变种。
Spring Security提供了很多自定义登录的方式,以下是一种常见的自定义登录流程: 1. 创建一个实现了UserDetailsService接口的自定义UserDetailsService类,用于从数据库或其他数据源中获取用户信息。该接口有一个loadUserByUsername方法,根据用户名加载用户信息并返回一个UserDetails对象。 2. 创建一个实现了PasswordEncoder接口的密码编码器类,用于对用户密码进行加密和验证。常见的实现类有BCryptPasswordEncoder和PasswordEncoder,可以根据项目需求选择合适的实现类。 3. 创建一个继承自WebSecurityConfigurerAdapter的配置类,并重写configure方法。在该方法中,可以配置登录页面、登录成功后的跳转页面、登录失败后的处理等。 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private UserDetailsService userDetailsService; @Autowired private PasswordEncoder passwordEncoder; @Override protected void configure(HttpSecurity http) throws Exception { .authorizeRequests() .antMatchers("/css/**", "/js/**", "/images/**").permitAll() // 静态资源放行 .antMatchers("/login").permitAll() // 登录页面放行 .anyRequest().authenticated() // 其他请求需要认证 .and() .formLogin() .loginPage("/login") // 自定义登录页面路径 .defaultSuccessUrl("/home") // 登录成功后的默认跳转路径 .failureUrl("/login?error") // 登录失败后的路径 .and() .logout() .logoutUrl("/logout") // 退出登录的路径 .logoutSuccessUrl("/login?logout") // 退出登录后的路径 .and() .csrf().disable(); @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder); 4. 在登录页面的表单中,需要包含用户名和密码的输入框,并将表单提交到Spring Security提供的默认登录处理路径("/login")。 这样就完成了一个简单的Spring Security自定义登录流程。你可以根据项目需求进行更多的自定义配置,例如添加记住我功能、验证码等。
整合ElasticSearch,出现IllegalStateException: availableProcessors is already set to [12], rejecting [12] 空~自由: 简单来讲,分片就是把索引数据切分成多个索引块,分发到集群中的不同节点,检索数据时,检索结果就是每个分片上的索引数据的合并;有点类似关系型数据库中的分库分表;而副本主要提供高可用(备份容灾)和提高并发查询能力。主分片可读可写,副分片可读。 至于分片和副本数量的设置,主要根据索引的数据量以及支撑的qps去判断 整合ElasticSearch,出现IllegalStateException: availableProcessors is already set to [12], rejecting [12] CSDN-Ada助手: Elasticsearch 中的分片和副本有什么区别?如何配置分片和副本? spark系列之spark-submit提交spark程序 CSDN-Ada助手: 哇, 你的文章质量真不错,值得学习!不过这么高质量的文章, 还值得进一步提升, 以下的改进点你可以参考下: (1)提升标题与正文的相关性。 Apache Ranger 介绍与使用 CSDN-Ada助手: 关于 Apache ZooKeeper,你了解多少? 过滤uri,只允许微服务间在内网调用,不允许外网通过网关调用 CSDN-Ada助手: 介绍一下国内主导的云原生产品?