spring jwt认证,springboot+springsecurity+jwt

  spring jwt认证,springboot+springsecurity+jwt

  

目录

整合步骤实现原理目录结构做了哪些变化前言:

 

  学习过我的购物中心项目的应该知道,商场管理模块是使用JWT春天安全公司来实现登录认证的,而商城门户模块是使用的权限管理基于会议的默认机制来实现登陆认证的。很多小伙伴都找不到商城门户的登录接口,最近我把这两个模块的登录认证给统一了,都使用JWT春天安全公司的形式实现。主要是通过把登录认证的通用逻辑抽取到了商场安全模块来实现的,下面我们讲讲如何使用商场安全模块来实现登录认证,仅需四步即可。

  

整合步骤

这里我们以商城门户改造为例来说说如何实现。

 

  第一步,给需要登录认证的模块添加商场安全依赖:

  相关性groupIdcom.macro.mall/groupId神器id商城-安全性/工件id/相关性第二步,添加MallSecurityConfig配置类,继承商场安全中的安全配置配置,并且配置一个用户详细信息服务接口的实现类,用于获取登录用户详情:

  /** *商场-安全模块相关配置*由巨于2019/11/5创建. Configuration @ enable web security @ EnableGlobalMethodSecurity(prePostEnabled=true)公共类MallSecurityConfig扩展安全配置{ @ auto wired private UmsMemberService memberService;@ Bean public UserDetailsService UserDetailsService(){//获取登录用户信息返回用户名-会员服务。loaduserbysusername(用户名);} }第三步,在application.yml中配置下不需要安全保护的资源路径:

  安全:忽略: URL : #安全路径白名单-/swagger-ui。html-/swagger-resources/* */swagger/* *-/* */v2/API-docs-/* */* .js -/**/* .css -/**/* .png -/**/* .ico-/web jars/spring fox-swagger-ui/* */druid/* */actuator/* */SSO/* */home/* *第四步,在UmsMemberController中实现登录和刷新token的接口:

  /** * 会员登录注册管理控制器*由宏在2018/8/3创建. */@ Controller @ Api(tags= ums成员控制器,description=会员登录注册管理)@请求映射(/SSO )公共类UmsMemberController { @ Value( $ { jwt .令牌头} )私有字符串token header @ Value($ { jwt . token head } )私有字符串token head @ auto wired private UmsMemberService成员服务;@ApiOperation(会员登录)@RequestMapping(value=/login ,method=RequestMethod .POST) @R

  esponseBody public CommonResult login(@RequestParam String username, @RequestParam String password) { String token = memberService.login(username, password); if (token == null) { return CommonResult.validateFailed("用户名或密码错误"); } Map<String, String> tokenMap = new HashMap<>(); tokenMap.put("token", token); tokenMap.put("tokenHead", tokenHead); return CommonResult.success(tokenMap); } @ApiOperation(value = "刷新token") @RequestMapping(value = "/refreshToken", method = RequestMethod.GET) @ResponseBody public CommonResult refreshToken(HttpServletRequest request) { String token = request.getHeader(tokenHeader); String refreshToken = memberService.refreshToken(token); if (refreshToken == null) { return CommonResult.failed("token已经过期!"); } Map<String, String> tokenMap = new HashMap<>(); tokenMap.put("token", refreshToken); tokenMap.put("tokenHead", tokenHead); return CommonResult.success(tokenMap); }}

 

  

实现原理

将SpringSecurity+JWT的代码封装成通用模块后,就可以方便其他需要登录认证的模块来使用,下面我们来看看它是如何实现的,首先我们看下mall-security的目录结构。

 

  

 

  

目录结构

mall-security├── component ├── JwtAuthenticationTokenFilter -- JWT登录授权过滤器 ├── RestAuthenticationEntryPoint -- 自定义返回结果:未登录或登录过期 └── RestfulAccessDeniedHandler -- 自定义返回结果:没有权限访问时├── config ├── IgnoreUrlsConfig -- 用于配置不需要安全保护的资源路径 └── SecurityConfig -- SpringSecurity通用配置└── util └── JwtTokenUtil -- JWT的token处理工具类

 

  

做了哪些变化

其实我也就添加了两个类,一个IgnoreUrlsConfig,用于从application.yml中获取不需要安全保护的资源路径。一个SecurityConfig提取了一些SpringSecurity的通用配置。

 

  

IgnoreUrlsConfig中的代码:

 

  

/** * 用于配置不需要保护的资源路径 * Created by macro on 2018/11/5. */@Getter@Setter@ConfigurationProperties(prefix = "secure.ignored")publicclass IgnoreUrlsConfig { private List<String> urls = new ArrayList<>();}

SecurityConfig中的代码:

 

  

/** * 对SpringSecurity的配置的扩展,支持自定义白名单资源路径和查询用户逻辑 * Created by macro on 2019/11/5. */publicclass SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity httpSecurity) throws Exception { ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry registry = httpSecurity .authorizeRequests(); //不需要保护的资源路径允许访问 for (String url : ignoreUrlsConfig().getUrls()) { registry.antMatchers(url).permitAll(); } //允许跨域请求的OPTIONS请求 registry.antMatchers(HttpMethod.OPTIONS) .permitAll(); // 任何请求需要身份认证 registry.and() .authorizeRequests() .anyRequest() .authenticated() // 关闭跨站请求防护及不使用session .and() .csrf() .disable() .sessionManagement() .sessionCreationPolicy(SessionCreationPolicy.STATELESS) // 自定义权限拒绝处理类 .and() .exceptionHandling() .accessDeniedHandler(restfulAccessDeniedHandler()) .authenticationEntryPoint(restAuthenticationEntryPoint()) // 自定义权限拦截器JWT过滤器 .and() .addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class); } @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { auth.userDetailsService(userDetailsService()) .passwordEncoder(passwordEncoder()); } @Bean public PasswordEncoder passwordEncoder() { returnnew BCryptPasswordEncoder(); } @Bean public JwtAuthenticationTokenFilter jwtAuthenticationTokenFilter() { returnnew JwtAuthenticationTokenFilter(); } @Bean @Override public AuthenticationManager authenticationManagerBean() throws Exception { returnsuper.authenticationManagerBean(); } @Bean public RestfulAccessDeniedHandler restfulAccessDeniedHandler() { returnnew RestfulAccessDeniedHandler(); } @Bean public RestAuthenticationEntryPoint restAuthenticationEntryPoint() { returnnew RestAuthenticationEntryPoint(); } @Bean public IgnoreUrlsConfig ignoreUrlsConfig() { returnnew IgnoreUrlsConfig(); } @Bean public JwtTokenUtil jwtTokenUtil() { returnnew JwtTokenUtil(); }}

到此这篇关于Java SpringSecurity+JWT实现登录认证 的文章就介绍到这了,更多相关Java SpringSecurity 内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

 

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: