首页 > 其他分享 >整合security跨域问题

整合security跨域问题

时间:2022-10-01 10:39:39浏览次数:53  
标签:map 跨域 res resp 整合 put new security ObjectMapper

public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private UserDetailsService userDetailsService;

// 动态认证
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.userDetailsService(userDetailsService).passwordEncoder(password());
}

// 加密方式
@Bean
PasswordEncoder password() {
return new BCryptPasswordEncoder();
}

private final ObjectMapper objectMapper;

private Filter restAuthenticationFilter() throws Exception {
RestAuthenticationFilter filter = new RestAuthenticationFilter(objectMapper);
filter.setAuthenticationSuccessHandler(getAuthenticationSuccessHandler());
filter.setAuthenticationFailureHandler(getAuthenticationFailureHandler());
filter.setAuthenticationManager(authenticationManager());
// 过滤器入口
filter.setFilterProcessesUrl("/authorize/login");
return filter;
}

@Override
protected void configure(HttpSecurity http) throws Exception {

http
// 使用token 关闭csrf
.csrf().disable()
// 跨域配置
.cors().configurationSource(corsConfigurationSource());

http.logout().logoutUrl("/logout");

http.exceptionHandling().accessDeniedPage("/403.html");

http.authorizeRequests(req -> req
// 不需要认证
.antMatchers("/test", "/file/**", "/**/swagger/**",
"/user/**", "/agencies/**", "/zoneSet/**", "/plateSet/**", "/precinctsSet/**", "/intentManagement/**", "/contract/**"
).permitAll()
// 需要ROLE_ADMIN权限
//.antMatchers("/admin/**").hasRole("ADMIN")
// 需要ROLE_USER权限
//.antMatchers("/user/**").hasRole("USER")
// 其他需要认证
.anyRequest().authenticated())
.addFilterAt(restAuthenticationFilter(), UsernamePasswordAuthenticationFilter.class)
.formLogin(form -> form.loginProcessingUrl("/login").permitAll()
// 登录成功后的处理
.successHandler(getAuthenticationSuccessHandler())
// 登录失败后的处理
.failureHandler(getAuthenticationFailureHandler())
.permitAll())
.httpBasic(Customizer.withDefaults())
.csrf(csrf -> csrf.disable())
.logout(logout -> logout.logoutUrl("/logout")
// 退出登录成功后的处理
.logoutSuccessHandler(getLogoutSuccessHandler()));
}

// 登录成功后的处理
private AuthenticationSuccessHandler getAuthenticationSuccessHandler() {
return (req, res, auth) -> {
res.setStatus(HttpStatus.OK.value());
res.getWriter().println();
log.debug("认证成功!");
// 响应给前端
Map<Object, Object> map = new HashMap<>();
map.put("code",200);
map.put("msg","login success");
map.put("data","true");
String jsonMap = new ObjectMapper().writeValueAsString(map);
res.setContentType("application/json;charset=UTF-8");
res.getWriter().println(jsonMap);
};
}

// 登录失败后的处理
private AuthenticationFailureHandler getAuthenticationFailureHandler() {
return (req, res, exp) -> {
ObjectMapper objectMapper = new ObjectMapper();
res.setStatus(HttpStatus.UNAUTHORIZED.value());
res.setContentType(MediaType.APPLICATION_JSON_VALUE);
res.setCharacterEncoding("UTF-8");
res.getWriter().println(objectMapper.writeValueAsString(exp.getMessage()));
log.debug("认证失败!");
Map<Object, Object> map = new HashMap<>();
map.put("code",201);
map.put("msg","login fail");
map.put("data","false");
String jsonMap = new ObjectMapper().writeValueAsString(map);
res.setContentType("application/json;charset=UTF-8");
res.getWriter().println(jsonMap);
};
}

// 退出登录成功后的处理
private LogoutSuccessHandler getLogoutSuccessHandler() {
return (req, resp, auth) -> {
ObjectMapper objectMapper = new ObjectMapper();
resp.setStatus(HttpStatus.OK.value());
resp.setContentType(MediaType.APPLICATION_JSON_VALUE);
// resp.setCharacterEncoding("UTF-8");
// resp.getWriter().println(objectMapper.writeValueAsString(auth));
log.debug("退出登录成功!");
Map<Object, Object> map = new HashMap<>();
map.put("code",200);
map.put("msg","logout success");
map.put("data","true");
String jsonMap = new ObjectMapper().writeValueAsString(map);
resp.setContentType("application/json;charset=UTF-8");
resp.getWriter().println(jsonMap);
};
}

// 解决跨域
private CorsConfigurationSource corsConfigurationSource() {
UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
CorsConfiguration corsConfiguration = new CorsConfiguration();
corsConfiguration.addAllowedOrigin("*");
corsConfiguration.addAllowedHeader("*");
corsConfiguration.addAllowedMethod("*");
source.registerCorsConfiguration("/**", corsConfiguration);
return source;
}

}



标签:map,跨域,res,resp,整合,put,new,security,ObjectMapper
From: https://blog.51cto.com/chniny/5728124

相关文章

  • 启动 Hello Spring Security Boot 应用
    本文章对如何快速启动一个启动HelloSpringSecurityBoot应用进行说明。下载代码在这个项目中,使用的是 spring.io 的项目生成程序,生成的地址为:https://start.sprin......
  • 后端跨域配置类
    importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.config.annotation.CorsRegistry;importorg.springframework.......
  • Spring Security 在 Servlet 的作用区域
    SpringSecurity使用标准的Servlet 过滤器(Filter) 并与Servlet容器集成。这个意味着SpringSecurity可以在任何运行运行在Servlet容器(ServletContainer)中的应用......
  • 学习笔记:springBoot整合七牛云
    在项目开发的过程中,文件存储是一大问题,本人遇到的情况是服务器的操作系统从原来的Linux变成了windowServer,但是,自己写的文件上传具有SFTP功能,服务器对于一些路径出现了乱......
  • .Net下的CORS跨域设置
    CORS跨域访问问题往往出现在“浏览器客户端”通过ajax调用“服务端API”的时候。而且若是深究原理,还会发现跨域问题其实还分为【简单跨域】与【复杂跨域】这两种情况。网......
  • 万字长文,SpringSecurity
    权限系统躲不开的概念,在Shiro和SpringSecurity之间,你一般选啥?在前后端分离的项目中,你知道怎么Springsecurity整合JWT么,来看看这篇文章哈!思维导图如下:RBAC全称为基于......
  • Spring Security 介绍中的 servlet 和 reactive
    最近在看看SpringSecurity中的内容。看到了下面一段话,还挺拗口的。SpringSecurity提供了一个验证(authentication),授权(authorization),和保护常见攻击的框架。Sprin......
  • Oauth2.0 用Spring-security-oauth2 来实现
    前言:要准备再次研究下统一认证的功能了,我还是觉得实现统一认证用Oauth2最好了,所以,现在再次收集资料和记笔记。正文:一、概念理解    OAuth2,是个授权协议,......
  • 安全框架 SpringSecurity 和 Shiro 对比
    突然再次很想理一下权限的事,但是实在不知道实际情况选哪个框架好,现在整理下网上的资料,做一下对比。1、Spring-security对spring结合较好,如果项目用的springmvc,使用起来很......
  • Apache Shiro和Spring Security的详细对比
    参考资料:1)ApacheShiroApacheShiro:​​http://shiro.apache.org/​​在Web项目中应用ApacheShiro:​​http://www.ibm.com/developerworks/cn/java/j-lo-shiro/​​Apac......