弹簧引导安全结合JWT实现无状态的分布式API接口

  

  

JSON Web标记(缩写JWT)是目前最流行的跨域认证解决方案. JSON Web标记入门教程这篇文章可以帮你了解JWT的概念。本文重点讲解弹簧引导结合JWT,来实现前后端分离中,接口的安全调用。
  

  

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

  

  

之前的文章已经对Spring Security进行了讲解,这一节对涉及到Spring Security的配置不详细讲解。若不了解Spring Security先移步到弹簧引导安全详解。

  

        删除表如果存在“用户”;   删除表如果存在“角色”;   删除表如果存在“user_role”;   删除表如果存在“role_permission”;   删除表如果存在“许可”;      创建表“用户”(   “id”bigint NOT NULL AUTO_INCREMENT (11),   “用户名”varchar(255)非空,   “密码”varchar(255)非空,   主键(“id”)   );   创建表的作用(   “id”bigint NOT NULL AUTO_INCREMENT (11),   “名字”varchar(255)不是NULL,   主键(“id”)   );   创建表“user_role”(   user_id的bigint(11)不是零,   role_id的bigint(11)不是零   );   创建表“role_permission”(   role_id的bigint(11)不是零,   permission_id的bigint(11)不是零   );   创建表的权限(   “id”bigint NOT NULL AUTO_INCREMENT (11),   “url”varchar(255)非空,   “名字”varchar(255)不是NULL,   “描述”varchar(255)为空,   “pid”bigint(11)不是零,   主键(“id”)   );      插入用户(id、用户名、密码)值(1、“用户”、“e10adc3949ba59abbe56e057f20f883e”);   插入用户(id、用户名、密码)值(2,'管理',' e10adc3949ba59abbe56e057f20f883e ');   插入作用(id、名称)值(“用户”);   插入作用(id、名称)值(2,'管理');   插入许可(id、url、名称、pid)值(1/user/嗨的",0);   插入许可(id、url、名称、pid)值(2 '/admin/嗨",0);   插入user_role (user_id role_id)值(1,1);   插入user_role (user_id role_id)值(2,1);   插入user_role (user_id role_id)值(2,2);   插入role_permission (role_id permission_id)值(1,1);   插入role_permission (role_id permission_id)值(2,1);   插入role_permission (role_id permission_id)值(2,2);      

项目结构

        资源   | ___application.yml   java   | ___com   | | ____gf   | | | ____SpringbootJwtApplication.java   | | | ____config   | | | | ____.DS_Store   | | | | ____SecurityConfig.java   | | | | ____MyFilterSecurityInterceptor.java   | | | | ____MyInvocationSecurityMetadataSourceService.java   | | | | ____MyAccessDecisionManager.java   | | | ____entity   | | | | ____User.java   | | | | ____RolePermisson.java   | | | | ____Role.java   | | | ____mapper   | | | | ____PermissionMapper.java   | | | | ____UserMapper.java   | | | | ____RoleMapper.java   | | | ____utils   | | | | ____JwtTokenUtil.java   | | | ____controller   | | | | ____AuthController.java   | | | ____filter   | | | | ____JwtTokenFilter.java   | | | ____service   | | | | ____impl   | | | | | ____AuthServiceImpl.java   | | | | | ____UserDetailsServiceImpl.java   | | | | ____AuthService.java      

关键代码

  

<强>砰的一声。xml
  

        & lt; dependency>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-starter-web   & lt;/dependency>   & lt; dependency>   & lt; groupId> org.springframework.boot   & lt; artifactId> spring-boot-starter-security   & lt;/dependency>   & lt; dependency>   & lt; groupId> io.jsonwebtoken   & lt; artifactId> jjwt   & lt; version> 0.9.0   & lt;/dependency>   & lt; dependency>   & lt; groupId> mysql   & lt; artifactId> mysql-connector-java   & lt; scope> runtime   & lt;/dependency>   & lt; dependency>   & lt; groupId> org.mybatis.spring.boot   & lt; artifactId> mybatis-spring-boot-starter   & lt; version> 2.0.0   & lt;/dependency>      

<强>应用程序。yml
  

        春天:   数据源:   driver-class-name: com.mysql.cj.jdbc.Driver   url: jdbc: mysql://localhost: 3306/spring-security-jwt& # 63; useUnicode=true& characterEncoding=utf-8& useSSL=false   用户名:根   密码:根   SecurityConfig   @ configuration   @EnableWebSecurity   公开课SecurityConfig延伸WebSecurityConfigurerAdapter {   @ autowired   私人UserDetailsService UserDetailsService;   @ autowired   公共空间configureGlobal (AuthenticationManagerBuilder auth)抛出异常{//校验用户   身份验证。userDetailsService (userDetailsService)。passwordEncoder(新passwordEncoder () {//对密码进行加密   @Override   公共字符串编码(CharSequence进行CharSequence进行){   System.out.println (charSequence.toString ());   .getBytes返回DigestUtils.md5DigestAsHex (charSequence.toString () ());   }//对密码进行判断匹配   @Override   公共布尔匹配(CharSequence进行CharSequence进行字符串s) {   .getBytes字符串编码=DigestUtils.md5DigestAsHex (charSequence.toString () ());   布尔res=?(编码);   返回res;   }   });   }   @Override   保护无效配置(HttpSecurity http){抛出异常   .disable http.csrf () ()//因为使用JWT,所以不需要HttpSession   .sessionManagement ()。sessionCreationPolicy (SessionCreationPolicy.STATELESS), ()   .authorizeRequests ()//选项请求全部放行   .antMatchers (HttpMethod。选项,“/* *”).permitAll ()   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null   null

弹簧引导安全结合JWT实现无状态的分布式API接口