默认自定义配置
一、自定义成功处理器
使用继承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]
空~自由:
整合ElasticSearch,出现IllegalStateException: availableProcessors is already set to [12], rejecting [12]
CSDN-Ada助手:
spark系列之spark-submit提交spark程序
CSDN-Ada助手:
Apache Ranger 介绍与使用
CSDN-Ada助手:
过滤uri,只允许微服务间在内网调用,不允许外网通过网关调用
CSDN-Ada助手: