spring boot security 不拦截_SpringBoot服务整合安全认证Security

0a4ed2215e41b4a9bf5fad368e33951d.png

前言

有这么个需求:客户端不能直接访问后端服务,需经过网关进行权鉴及安全认证后在将请求转发到后端。但如果开发人员过用户知道后端地址这个时候完全可以跳过网关服务直接请求到后端,这样后端服务就会承受安全风险,这个时候我们就要用到Spring Security。

5a8e71b98a7a035c588244be6f8b6463.png

Spring Security简介

Spring Security,这是一种基于 Spring AOP 和 Servlet 过滤器的安全框架。它提供全面的安全性解决方案,同时在 Web 请求级和方法调用级处理身份确认和授权。

d4bf1f3a7a44afdb19f6c929ec0bd3cd.png

SpringBoot集成Security

这里我们将Security单独建立为一个核心微服务:microservice-security,这样其他后端微服务执行引入这个jar就可以实现安全认证。

pom我们导入如下jar:

org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-data-couchbase 

同时我们编写WebSecurityConfig类,该类继承WebSecurityConfigurerAdapter,现通过以下方法可配置拦截URL,配置忽略认证地址及设置什么权限等安全控制。

@Configuration@EnableWebSecuritypublic class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Override public void configure(WebSecurity web) { String[] antPatterns = new String[] { /** 忽略异步推送地址权鉴 */ "/v1/notifyUrl", "/v1/faceLite/gainResultAndReturnUrl" }; /**忽略auth认证URL*/ web.ignoring().antMatchers(antPatterns); } @Override protected void configure(HttpSecurity http) throws Exception { /**表示所有的访问都必须进行认证处理后才可以正常进行*/ http.httpBasic().and().authorizeRequests().anyRequest().fullyAuthenticated(); /**所有的Rest服务一定要设置为无状态,以提升操作性能*/ http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); http.csrf().disable(); }}

配置application-security.yml,设置安全认证密码:

spring: security: user: name: wxt12138 password: wxt12138 roles: - USER - ACTUATOR

通过上述三步我们编写提供端微服务并引入microservice-security,注意提供端微服务application.yml配置需要引入security的配置文件:

spring: profiles: include: - security

此时我们直接访问提供端服务会出现401异常。

{ "timestamp": "2019-12-03T16:46:59.961+0000", "status": 401, "error": "Unauthorized", "message": "Unauthorized", "path": "/xxx/xxx"}

此时我们的安全认证是已经生效,这时我们还需要配置gateway网关服务,网关服务中实现OAuth授权。相关代码片段如下:

@Componentpublic class OAuthSignatureFilter implements GlobalFilter, Ordered { /**授权访问用户名*/ @Value("${spring.security.user.name}") private String securityUserName; /**授权访问密码*/ @Value("${spring.security.user.password}") private String securityUserPassword; /**OAuth过滤器*/ @Override public Mono filter(ServerWebExchange exchange, GatewayFilterChain chain) { /**oauth授权*/ String auth = securityUserName.concat(":").concat(securityUserPassword); String encodedAuth = null; try { encodedAuth = Base64Utils.encode(auth.getBytes(Charset.forName("US-ASCII"))); } catch (UnsupportedEncodingException e) { MySlf4j.textError("BASE64编码异常:{0}",MySlf4j.ExceptionToString(e)); } String authHeader = "Basic " + encodedAuth; //向headers中放授权信息 ServerHttpRequest serverHttpRequest = exchange.getRequest().mutate().header("Authorization", authHeader) .build(); //将现在的request变成change对象 ServerWebExchange build = exchange.mutate().request(serverHttpRequest).build(); return chain.filter(build); } /**优先级,数字越大优先级越低 */ @Override public int getOrder() { return 3; }}

至此我们完成了SpringBoot服务的权限认证。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot整合Spring Security可以实现登录认证和数据权限管理。下面是简单的步骤: 1. 添加依赖 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> ``` 2. 配置Spring Security 在主配置类中添加@EnableWebSecurity注解,开启Spring Security,并且创建一个继承自WebSecurityConfigurerAdapter的配置类,用于配置Spring Security。 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // 配置登录页面和登录请求的路径 http.formLogin() .loginPage("/login") .loginProcessingUrl("/login") .defaultSuccessURL("/home") .and() // 配置退出登录的路径和跳转页面 .logout() .logoutUrl("/logout") .logoutSuccessUrl("/login") .and() // 配置拦截规则 .authorizeRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated() .and() // 关闭CSRF保护 .csrf().disable(); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { // 配置用户信息和密码加密方式 auth.inMemoryAuthentication() .passwordEncoder(new BCryptPasswordEncoder()) .withUser("admin") .password(new BCryptPasswordEncoder().encode("admin")) .roles("ADMIN"); } } ``` 3. 配置数据权限管理 如果需要实现数据权限管理,可以在配置类中添加一个实现了FilterInvocationSecurityMetadataSource接口的类,用于获取当前请求所需的权限信息,并且在配置类中添加一个实现了AccessDecisionManager接口的类,用于判断当前用户是否有访问该资源的权限。 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private CustomFilterInvocationSecurityMetadataSource customFilterInvocationSecurityMetadataSource; @Autowired private CustomAccessDecisionManager customAccessDecisionManager; @Override protected void configure(HttpSecurity http) throws Exception { // 配置拦截规则 http.authorizeRequests() .withObjectPostProcessor(new ObjectPostProcessor<FilterSecurityInterceptor>() { @Override public <O extends FilterSecurityInterceptor> O postProcess(O object) { object.setSecurityMetadataSource(customFilterInvocationSecurityMetadataSource); object.setAccessDecisionManager(customAccessDecisionManager); return object; } }) .and() // 关闭CSRF保护 .csrf().disable(); } } ``` 参考资料: 1. Spring Security官方文档:https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/ 2. Spring Boot整合Spring Security实现登录认证和数据权限管理:https://www.jianshu.com/p/04d848c9cb8d

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值