基于springBoot+springSecurity+jwt实现前后端分离用户权限认证


1. 项目说明

  主要基于前后端分离情况下用户权限认证, 当用户登录认证成功后,每个用户会获取到自己的token,在请求其他接口时只需携带token即可,后端会通过token来识别用户身份。springSecurity也有很多种权限认证方式,本项目主要实现基于接口授权,也就是说通过注解给controller赋予权限,用户只有拥有某个接口的权限才能成功访问这个接口,从而实现不同用户拥有不同访问权限;


2. 项目结构

1、 使用maven引入依赖在pom.xml中添加以下依赖(springSecurity+jwt)

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version>
</dependency>

2、通过 application.properties配置项目系统库和jwt认证

spring.datasource.mg.cboard.url=jdbc:mysql://192.168.0.65:3306/pharos?useUnicode=true&characterEncoding=UTF-8
spring.datasource.mg.cboard.username=pharos
spring.datasource.mg.cboard.password=Ketech@123456
spring.datasource.mg.cboard.driver-class-name=com.mysql.cj.jdbc.Driverjwt.tokenHeader: Authorization
#JWT存储的请求头
jwt.secret: ketech-pharos
#JWT加解密使用的密钥
jwt.expiration: 604800
#JWT的超期限时间(60*60*24*7)
jwt.tokenHead: 'Bearer '
#JWT负载中拿到开头

3、 用户权限关系表导入数据库
** 表结构在项目源码中可自行下载


4、 编写jwt工具类 主要功能是:用户信息加密,除了登录认证时账号密码需要明文传输,其他地方都需要加密后传输,通过jwt对用户加密后形成token,用来进行用户认证。添加token时效,每个用户请求接口不是永久的,如果是永久的那么他就没有存在的意义了;token验证,token有自己加密协议, 来保证接口安全;token解密,将token翻译成明文信息;

@Component
public class JwtUtils {@Value("${jwt.secret}")private String secret;@Value("${jwt.expiration}")private  Long expiration;/*** 创建token* @param username 用户名* @return*/public  String generateToken(String username) {return Jwts.builder().signWith(SignatureAlgorithm.HS512, secret).setSubject(username).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis() + expiration * 1000)).compact();}/*** 从token中获取用户名* @param token* @return*/public  String getUserNameFromToken(String token){return getTokenBody(token).getSubject();}/***  是否已过期* @param token* @return*/public  boolean isExpiration(String token){return getTokenBody(token).getExpiration().before(new Date());}private  Claims getTokenBody(String token){Claims claims=null;try {claims = Jwts.parser().setSigningKey(secret).parseClaimsJws(token).getBody();}catch (Exception e){throw new DescribeException(ExceptionEnum.valid_token);}return claims;}}

4、 配置springSecurity 1 简介 他的核心功能是: 1认证:这个地方需要整合jwt对用户进行认证 2 授权:认证完成后,在数据库中获取用户的权限。接口会有自己的权限,只有当用户权限和接口所需权能匹配时,用户才能成功访问接口; 3 过滤器:其核心是一条过滤链,只有当每个filter通过了才能请求到接口,这个中间过程需要自己配置,并不是所有接口都需要权限,比如登录接口,异常接口 ;


2 核心代码简介
1> 用户拦截

@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {@AutowiredUserDetailsServiceImpl userDetailsServices;//    @Autowired
//    FavUserDetailService favUserDetailService;/*** 验证码拦截器*/
//    @Autowired
//    private VerifyCodeFilter verifyCodeFilter;/*** 登录成功逻辑*/@AutowiredAuthenticationSuccessHandlerImp authenticationSuccessHandler;/*** 登录失败逻辑*/@AutowiredAuthenticationFailureHandlerImp authenticationFailureHandler;//    /**
//     * 无权限拦截器
//     */
//    @Autowired
//    RestAuthenticationEntryPoint restAuthenticationEntryPoint;/*** 无权访问 JSON 格式的数据*/@Autowiredprivate AccessDeniedHandlerImp accessDeniedHandler;@Autowiredprivate AuthenticationEntryPointImp authenticationEntryPointImp;@Overridepublic void configure(WebSecurity web) throws Exception {//放行静态资源web.ignoring().antMatchers("/v2/api-docs","/swagger-resources/configuration/ui","/swagger-resources","/swagger-resources/configuration/security","/swagger-ui.html").antMatchers(HttpMethod.POST, "/user/login","/swagger-ui.html");}/*** anyRequest          |   匹配所有请求路径* access              |   SpringEl表达式结果为true时可以访问* anonymous           |   匿名可以访问* denyAll             |   用户不能访问* fullyAuthenticated  |   用户完全认证可以访问(非remember-me下自动登录)* hasAnyAuthority     |   如果有参数,参数表示权限,则其中任何一个权限可以访问* hasAnyRole          |   如果有参数,参数表示角色,则其中任何一个角色可以访问* hasAuthority        |   如果有参数,参数表示权限,则其权限可以访问* hasIpAddress        |   如果有参数,参数表示IP地址,如果用户IP和参数匹配,则可以访问* hasRole             |   如果有参数,参数表示角色,则其角色可以访问* permitAll           |   用户可以任意访问* rememberMe          |   允许通过remember-me登录的用户访问* authenticated       |   用户登录后可访问*/@Overrideprotected void configure(HttpSecurity http) throws Exception {
//        https://blog.csdn.net/qq_42394044/article/details/109443284
//        http.addFilterBefore(verifyCodeFilter, UsernamePasswordAuthenticationFilter.class);//允许跨域访问http.cors();//放行swaggerhttp.authorizeRequests().antMatchers("/v2/api-docs",//swagger api json"/swagger-resources/configuration/ui",//用来获取支持的动作"/swagger-resources",//用来获取api-docs的URI"/swagger-resources/configuration/security",//安全选项"/swagger-ui.html","/webjars/**").permitAll();//关闭csrfhttp.csrf().disable().sessionManagement()// 基于token,所以不需要session.sessionCreationPolicy(SessionCreationPolicy.STATELESS).and()//未登陆时返回 JSON 格式的数据给前端.httpBasic().authenticationEntryPoint(authenticationEntryPointImp).and().authorizeRequests()//任何人都能访问这个请求.antMatchers("/swagger-ui.html","/user/login","/user/get").permitAll()//除上面配置的路径外,所有的请求都需要进行认证后才能访问.anyRequest().authenticated().and().formLogin()// (登录页面或是提示用户未登录的页面).loginPage("/user/get").permitAll()//认证通过后的事件处理(在这里返回token).loginProcessingUrl("/user/login")// 登录成功.successHandler(authenticationSuccessHandler)// 登录失败.failureHandler(authenticationFailureHandler).permitAll().and()//设置登录注销url,这个无需我们开发,springsecurity已帮我们做好.logout().logoutUrl("/user/logout").permitAll().and()//配置 记住我 功能,.rememberMe().rememberMeParameter("rememberme");
//                 防止iframe 造成跨域
//                .and()
//                .headers()
//                .frameOptions()
//                .disable();http.httpBasic().disable();//.and().httpBasic(); //开启HTTP Basic后 ,可用postman通过携带用户名+密码直接请求接口// 禁用缓存http.headers().cacheControl();// 添加自定义 JWT 过滤器http.addFilterBefore(jwtAuthenticationTokenFilter(), UsernamePasswordAuthenticationFilter.class);// 无权访问 JSON 格式的数据http.exceptionHandling().accessDeniedHandler(accessDeniedHandler);//没有认证时,在这里处理结果,不要重定向http.exceptionHandling().authenticationEntryPoint(authenticationEntryPointImp);}@Beanpublic JwtAuthenticationTokenFilters jwtAuthenticationTokenFilter() {return new JwtAuthenticationTokenFilters();}//    //密码编码器
//    @Bean
//    public PasswordEncoder passwordEncoder(){
//        return NoOpPasswordEncoder.getInstance();
//    }@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder(12);}/*** 身份认证接口*/@Overrideprotected void configure(AuthenticationManagerBuilder auth) throws Exception {auth.userDetailsService(userDetailsServices).passwordEncoder(passwordEncoder());}}

1 @EnableWebSecurity
利用@EnableWebSecurity 注解继承 WebSecurityConfigurerAdapter的类,这样就构成了 Spring Security 的配置;

2 @EnableGlobalMethodSecurity(prePostEnabled = true)
配置基于接口授权

3 WebSecurityConfigurerAdapter
通过继承次类重写他的方法来配置权限拦截;

HttpSecurity常用方法和说明:


2> 用户授权 前面我们通过jwt对用户进行了认证,WebSecurityConfigurerAdapter对通过认证的用户进行权限过滤,接下来需要实现UserDetailsService的loadUserByUsername方法对用户进行授权;

@Service
@Slf4j
public class UserDetailsServiceImpl implements UserDetailsService {@AutowiredUserService userService;/*** 根据用户名获取用户 - 用户的角色、权限等信息*/@Overridepublic UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {UserDetails userDetails = null;try {PharosUser user = userService.getUserByName(userName);List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>();List<MenuIndexDto> list = userService.listByUserId(user.getUserId());for (MenuIndexDto dto : list) {String authority = dto.getPermission();if (!("").equals(authority) & authority != null) {authList.add(new SimpleGrantedAuthority(dto.getPermission()));}}userDetails = new User(user.getUserName(), user.getPassword(), true, true, true, true, authList);} catch (Exception e) {e.printStackTrace();}return userDetails;}}

5 postma测试 1 获取通过用户名+密码获取token

2 访问需要权限的接口

3 访问用户没有访问权限的接口


项目地址:https://download.csdn.net/download/qq_38200425/13608413

Java权限管理|基于springBoot+springSecurity+jwt实现前后端分离用户权限认证相关推荐

  1. 基于Springboot+MybatisPlus+Vue的前后端分离电子商城系统

    一.基于Springboot+MybatisPlus+Vue的前后端分离电子商城系统 基于Springboot+MybatisPlus+Vue的前后端分离电子商城系统,主要分为用户端和管理端两个模块. ...

  2. 基于SpringBoot+Vue开发的前后端分离博客项目-Java后端接口开发

    文章目录 1. 前言 2. 新建Springboot项目 3. 整合mybatis plus 第一步:导依赖 第二步:写配置文件 第三步:mapper扫描+分页插件 第四步:代码生成配置 第五步:执行 ...

  3. 基于SpringBoot+Vue开发的前后端分离人力资源管理系统

    项目介绍 一款 Java 语言基于 SpringBoot2.x.MybatisPlus.Vue.ElementUI.MySQL等框架精心打造的一款前后端分离框架,致力于实现模块化.组件化.可插拔的前后 ...

  4. 基于springboot 快速搭建简单前后端分离项目-后台框架

    目录 1.新建project 2.选择依赖 3.简单配置 4.数据库准备 5.完成后台逻辑代码 5.1创建java实体对象 5.2创建repository 5.3单元测试 5.4编写controlle ...

  5. 基于springBoot + vue 实现的前后端分离商城项目

    1,首页效果图 2:商品详情页 3:购物车详情 4:订单 5:待付款 6:收藏夹效果图如下 7:个人中心可以模拟充值支付效果 8:收获地址效果图如下 9:点赞收藏效果图 二:后台主要效果图如下 1:主 ...

  6. (2022)Springboot+vue3项目开发前后端分离书法图书管理Coun

    项目地址:https://github.com/KKJava1/Coun Coun是基于Springboot+vue3 项目采用了前后端分离技术:后端采用 springBoot 基本框架,数据库连接池 ...

  7. springboot jwt token前后端分离_实战:十分钟实现基于JWT前后端分离的权限框架

    前言 面试过很多Java开发,能把权限这块说的清楚的实在是不多,很多人因为公司项目职责问题,很难学到这类相关的流程和技术,本文梳理一个简单的场景,实现一个基于jwt前后端分离的权限框架. 简易流程 登 ...

  8. 视频教程-SpringBoot+Security+Vue前后端分离开发权限管理系统-Java

    SpringBoot+Security+Vue前后端分离开发权限管理系统 10多年互联网一线实战经验,现就职于大型知名互联网企业,架构师, 有丰富实战经验和企业面试经验:曾就职于某上市培训机构数年,独 ...

  9. 视频教程-基于springboot2.x+layui+shiro+redis整合前后端分离的权限管理系统-Java

    基于springboot2.x+layui+shiro+redis整合前后端分离的权限管理系统 拥有八年的Java项目开发经验,擅长Java.vue.SpringBoot.springCloud.sp ...

最新文章

  1. Windows 10预览版14316开启Bash命令支持
  2. url指定服务器,Linux服务器设置定时任务来访问指定url
  3. jdk javac运行不了_Intellij IDEA搭建jdk源码阅读环境
  4. 豆瓣/name-?P=0/事件
  5. [云炬小程序实战笔记] 第3章 云炬博客小程序全局配置
  6. directshow 旋转_宜昌中心加工机+A:B型号,高速旋转接头加工
  7. Golang预备知识
  8. 卡在linuxctrld进系统_电脑系统出现问题怎么办?学会这七招,电脑系统问题不求人!...
  9. C# for循环①护栏长度 ②广场砖面积 ③判断闰年平年
  10. java中map类型_Java中Map类型遍历的两种方式对比
  11. 如果奇迹有颜色,那么一定是暴力or模拟比较6
  12. 计算5的阶乘 5!的结果是?
  13. Python爬虫开源项目代码分享,100个
  14. 人脸识别系统的活体检测技术
  15. HashMap原理详解:探测技术(Probing)、数据聚集(Clustering)、寻址方式(Addressing)、墓碑删除(tombstones)等技术的深度剖析
  16. 微信小程序实现二维码签到考勤
  17. 什么是CPU,GPU,TPU,DPU,NPU,BPU
  18. cocos-creator使用记录5_发布微信小游戏
  19. 京东百万年薪大佬用JAVA绘制“五子棋棋盘”(附代码)
  20. 【成为架构师课程系列】作为一名大数据架构师该掌握的技能清单:

热门文章

  1. 五年级上册计算机教案闽教版,闽教版五年级上册信息技术教案
  2. STM32应用 TFT ILI9328液晶显示
  3. 招商银行香港一卡通的猫腻
  4. 通过SparkFun制作自己的Fritzing零件
  5. 浅谈大学计算机专业该如何选择方向
  6. 数据库中表table与视图view的区别
  7. 一款个性、实用、无痕的浏览器(大学生的最爱)
  8. 优秀自我简介200字_优秀初中自我介绍200字范文
  9. 登山冒险开拓新户外精神
  10. stata联立方程组笔记代码