Springcloud+Jwt应用开发

一 先理解以下架构图

 二 程序的结构:

 三 网关工程

  • springsecurity配置
//网关的配置
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		
		http.cors()
		    .and()
		    .sessionManagement()
		    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
		    .and()
		    .authorizeRequests()
		    .antMatchers("/doLogin")
		    .permitAll()
		    .anyRequest()
		    .authenticated()
		    .and()
		   // .addFilterBefore(new JwtAuthenticationFilter("/doLogin", authenticationManager()), UsernamePasswordAuthenticationFilter.class)   //用户认证, 成功和失败的回调
		    .addFilterBefore(new JwtAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class);  //资源的拦截的认证
		    
		http.csrf().disable();
		http.headers().cacheControl();
		
		//报错处理组件
		http.exceptionHandling().accessDeniedHandler(new RestAuthorizationHandler())
								.authenticationEntryPoint(new RestAuthenticationEntryPoint());
	}
}
  • 解决网关过滤敏感请求头的方法
  1. 在yml文件中配置,添加 sensitive-headers
eureka:
  client:
    service-url:
      defaultZone: http://localhost:8761/eureka/
server:
  port: 9999
spring:
  application:
    name: jwt-gateway
zuul:
  routes:
    api-auth:
      path: /doLogin
      service-id: auth-center
    api-microservice:
      path: /microservice/**
      service-id: jwt-microservice
  sensitive-headers: 
  1. 实现WebFilter,把敏感请求头加回来

        

@Component
public class WebFilter extends ZuulFilter {

	/**
	 * true: 执行run()
	 * false: 不执行run()
	 */
	@Override
	public boolean shouldFilter() {
		return true;
	}

	/**
	 * Filter的主方法,具体的业务代码
	 * 要把敏感的请求头放加到请求中
	 */
	@Override
	public Object run() throws ZuulException {
		RequestContext requestContext = RequestContext.getCurrentContext();
		HttpServletRequest request = requestContext.getRequest();
		String token = request.getHeader("authorization");
		System.out.println("zuul token:"+token);
		if (token != null && !"".equals(token)) {
			requestContext.addZuulRequestHeader("authorization", token);
		}
		return null;
	}

	@Override
	public String filterType() {
		return FilterConstants.PRE_TYPE;  //路由之前过滤 
	}

	@Override
	public int filterOrder() {
		return 0;
	}
}

四 验证中心

配置类

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

	@Autowired
	private SysUserService sysUserService;
	
	@Bean
	@Override
	protected AuthenticationManager authenticationManager() throws Exception {
		return super.authenticationManager();
	}
	
	@Bean
	public PasswordEncoder passwordEncoder() {
		return new BCryptPasswordEncoder();
	}
	
	@Bean
	public UserDetailsService userDetailsService() {
		return  new UserDetailsService() {
			
			@Override
			public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
				System.out.println("帐号:" + username);
				SysUser user = sysUserService.findUserByUsercode(username);
				if (user != null) {
					Collection<? extends GrantedAuthority> authorities = new ArrayList<>();
					return new UserDetailImpl(user, authorities );
				}
				throw new UsernameNotFoundException("帐号或密码错误");
			}
		};
		
	}
	
	@Override
	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
		auth.userDetailsService(userDetailsService());
	}
	
	@Override
	protected void configure(HttpSecurity http) throws Exception {
		
		http.cors()
		    .and()
		    .sessionManagement()
		    .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
		    .and()
		    .authorizeRequests()
		    .antMatchers("/doLogin")
		    .permitAll()
		    .anyRequest()
		    .authenticated()
		    .and()  
		    .addFilterBefore(new JwtAuthencationFilter("/doLogin", authenticationManager()), UsernamePasswordAuthenticationFilter.class);  //用户认证, 成功和失败的回调
		    //.addFilterBefore(new JwtAuthorizationFilter(), UsernamePasswordAuthenticationFilter.class);  //资源的拦截的认证
		    
		http.csrf().disable();
		http.headers().cacheControl();
		
		//报错处理组件
		http.exceptionHandling().accessDeniedHandler(new RestAuthorizationHandler())
								.authenticationEntryPoint(new RestAuthenticationEntryPoint());
	}
}

五 前端angular访问jwt

  • 用户认证前端实现

  • 前端拦截器实现

  • 后台服务访问

SpringCloud Gateway是一个基于Spring Framework 5,Spring Boot 2和Project Reactor的反应式API网关,它提供了一种简单而有效的方式来路由请求和过滤器请求,可以用于构建微服务架构中的网关层。 Spring Security是一个强大且灵活的身份验证和访问控制框架,可以集成到Spring应用程序中,用于保护应用程序的安全性。 JWT(JSON Web Token)是一种用于在网络应用间传递声明的一种基于JSON的开放标准。它可以通过数字签名来验证数据的完整性,并使用密钥对数据进行加密。 结合SpringCloud Gateway、Spring Security和JWT可以实现一个安全的微服务架构。在这种架构中,SpringCloud Gateway作为网关层负责路由请求和进行安全过滤,Spring Security用于进行身份验证和访问控制,而JWT则用于传递和验证身份信息。 具体实现方案可以参考以下步骤: 1. 在SpringCloud Gateway中配置路由规则,将请求转发到相应的微服务。 2. 在Spring Security中配置身份验证和访问控制规则,例如用户名密码验证、角色授权等。 3. 在用户登录时生成JWT,在每个请求中将JWT作为Authorization头部发送给网关。 4. 网关收到请求后,解析JWT并验证其有效性和签名,如果验证通过,则将请求转发到相应的微服务。 5. 微服务在接收到请求后,可以通过解析JWT获取用户身份信息,并根据用户的权限进行相应的业务处理。 以上是一个简单的概述,具体的实现需要根据实际需求进行配置和开发。希望对你有所帮助!如果你还有其他问题,请继续提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值