Spring Boot + Vue的网上商城之springsecurity+jwt+redis实现用户权限认证实现

这篇具有很好参考价值的文章主要介绍了Spring Boot + Vue的网上商城之springsecurity+jwt+redis实现用户权限认证实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Spring Boot + Vue的网上商城之springsecurity+jwt+redis实现用户权限认证实现

在网上商城项目中,用户的安全性是非常重要的。为了实现用户权限认证和安全校验,我们可以使用Spring Security、JWT和Redis来实现。本篇博客将详细介绍后端和前台的实现过程,并提供相应的代码案例。

思路

当用户点击登录按钮时,前端发送一个POST请求到后端的登录接口,传递用户名和密码。后端接收到请求后,验证用户名和密码的正确性。如果验证通过,后端生成一个JWT(JSON Web Token),并将其返回给前端。

前端接收到JWT后,将其存储在本地,例如使用localStorage。然后通过Vue Router进行页面跳转,跳转到需要进行权限校验的页面。

在需要进行权限校验的页面组件中,可以在created钩子函数中检查本地存储中是否存在JWT。如果不存在,则表示用户未登录或登录已过期,可以通过Vue Router跳转到登录页面。

需要注意的是,在每次向后端发送请求时,需要将JWT作为请求头的Authorization字段进行传递,以便后端进行权限校验。

后端在接收到请求时,可以通过解析JWT来验证用户的身份和权限。JWT中通常包含用户ID、用户名、权限信息等。后端可以使用Spring Security的相关功能进行JWT的解析和校验。

总结来说,用户登录和权限认证的流程可以简化为以下几个步骤:

  1. 用户在前端页面输入用户名和密码,并点击登录按钮。
  2. 前端发送POST请求到后端的登录接口,传递用户名和密码。
  3. 后端验证用户名和密码的正确性,如果验证通过,生成JWT并返回给前端。
  4. 前端接收到JWT后,将其存储在本地。
  5. 前端通过Vue Router进行页面跳转,跳转到需要进行权限校验的页面。
  6. 在需要进行权限校验的页面组件中,检查本地存储中是否存在JWT,如果不存在,则跳转到登录页面。
  7. 在每次向后端发送请求时,将JWT作为请求头的Authorization字段进行传递。
  8. 后端在接收到请求时,解析JWT并进行权限校验,校验通过则返回相应的数据或页面。

后端实现

Spring Security配置

首先,在后端的Spring Boot项目中,我们需要配置Spring Security来实现用户权限认证。我们可以创建一个SecurityConfig类来配置Spring Security。

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserService userService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable()
            .authorizeRequests()
                .antMatchers("/api/public/**").permitAll()
                .anyRequest().authenticated()
            .and()
                .addFilter(new JwtAuthenticationFilter(authenticationManager()))
                .addFilter(new JwtAuthorizationFilter(authenticationManager(), userService))
                .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

上述代码中,我们配置了允许访问/api/public/**路径的请求,其他请求需要进行认证。我们还添加了两个过滤器JwtAuthenticationFilterJwtAuthorizationFilter来处理JWT的认证和授权。

JWT认证和授权过滤器

接下来,我们来实现JWT的认证和授权过滤器。

public class JwtAuthenticationFilter extends UsernamePasswordAuthenticationFilter {

    private AuthenticationManager authenticationManager;

    public JwtAuthenticationFilter(AuthenticationManager authenticationManager) {
        this.authenticationManager = authenticationManager;
        setFilterProcessesUrl("/api/login");
    }

    @Override
    public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
        try {
            UserCredentials credentials = new ObjectMapper().readValue(request.getInputStream(), UserCredentials.class);
            return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(
                    credentials.getUsername(), credentials.getPassword(), new ArrayList<>()));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, FilterChain chain, Authentication authResult) throws IOException, ServletException {
        String token = Jwts.builder()
                .setSubject(((User) authResult.getPrincipal()).getUsername())
                .setExpiration(new Date(System.currentTimeMillis() + SecurityConstants.EXPIRATION_TIME))
                .signWith(SignatureAlgorithm.HS512, SecurityConstants.SECRET)
                .compact();
        response.addHeader(SecurityConstants.HEADER_STRING, SecurityConstants.TOKEN_PREFIX + token);
    }
}
public class JwtAuthorizationFilter extends BasicAuthenticationFilter {

    private UserService userService;

    public JwtAuthorizationFilter(AuthenticationManager authenticationManager, UserService userService) {
        super(authenticationManager);
        this.userService = userService;
    }

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
        String header = request.getHeader(SecurityConstants.HEADER_STRING);
        if (header == null || !header.startsWith(SecurityConstants.TOKEN_PREFIX)) {
            chain.doFilter(request, response);
            return;
        }
        UsernamePasswordAuthenticationToken authentication = getAuthentication(request);
        SecurityContextHolder.getContext().setAuthentication(authentication);
        chain.doFilter(request, response);
    }

    private UsernamePasswordAuthenticationToken getAuthentication(HttpServletRequest request) {
        String token = request.getHeader(SecurityConstants.HEADER_STRING);
        if (token != null) {
            String username = Jwts.parser()
                    .setSigningKey(SecurityConstants.SECRET)
                    .parseClaimsJws(token.replace(SecurityConstants.TOKEN_PREFIX, ""))
                    .getBody()
                    .getSubject();
            if (username != null) {
                User user = userService.loadUserByUsername(username);
                return new UsernamePasswordAuthenticationToken(user, null, user.getAuthorities());
            }
            return null;
        }
        return null;
    }
}

上述代码中,JwtAuthenticationFilter处理登录请求,将用户的认证信息封装为JWT,并添加到响应头中。JwtAuthorizationFilter处理其他请求,从请求头中获取JWT并进行认证和授权。

用户服务和认证

为了实现用户的认证和授权,我们需要创建一个用户服务实现类UserService

@Service
public class UserService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException(username);
        }
        return user;
    }
}

上述代码中,我们通过用户名从数据库中获取用户信息。

Redis存储Token

为了增加用户登录的安全性,我们可以将JWT存储到Redis中,并设置过期时间。

@Service
public class TokenService {

    private RedisTemplate<String, Object> redisTemplate;

    public TokenService(RedisTemplate<String, Object> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    public void saveToken(String username, String token) {
        redisTemplate.opsForValue().set(username, token, SecurityConstants.EXPIRATION_TIME, TimeUnit.MILLISECONDS);
    }

    public boolean validateToken(String username, String token) {
        String storedToken = (String) redisTemplate.opsForValue().get(username);
        return storedToken != null && storedToken.equals(token);
    }

    public void deleteToken(String username) {
        redisTemplate.delete(username);
    }
}

上述代码中,我们使用redisTemplate将用户名和JWT存储到Redis中,并设置过期时间。在校验Token时,我们从Redis中获取存储的Token进行比较。

前台实现

在前台,我们使用Vue来实现用户登录和权限认证的功能。我们需要创建相应的组件和路由来实现用户登录和权限校验。

登录组件

<template>
  <div>
    <h1>用户登录</h1>
    <form @submit.prevent="login">
      <label for="username">用户名:</label>
      <input type="text" id="username" v-model="username" required>
      <br>
      <label for="password">密码:</label>
      <input type="password" id="password" v-model="password" required>
      <br>
      <button type="submit">登录</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      username: '',
      password: ''
    };
  },
  methods: {
    login() {
      // 调用后端API接口进行用户登录
      // 使用axios或其他HTTP库发送POST请求
    }
  }
};
</script>

路由配置

import Vue from 'vue';
import VueRouter from 'vue-router';
import Login from './components/Login.vue';
import ProductList from './components/ProductList.vue';

Vue.use(VueRouter);

const routes = [
  { path: '/login', component: Login },
  { path: '/products', component: ProductList, meta: { requiresAuth: true } }
];

const router = new VueRouter({
  routes
});

router.beforeEach((to, from, next) => {
  const token = localStorage.getItem('token');
  if (to.matched.some(record => record.meta.requiresAuth)) {
    if (!token) {
      next('/login');
    } else {
      next();
    }
  } else {
    next();
  }
});

export default router;

在上述代码中,我们配置了两个路由,/login用于用户登录,/products用于展示商品列表。在/products路由中,我们设置了requiresAuthtrue,表示需要进行权限校验。在路由导航守卫中,我们检查是否存在Token,如果不存在则跳转到登录页面。

入口文件

import Vue from 'vue';
import App from './App.vue';
import router from './router';

new Vue({el: '#app',
  router,
  render: h => h(App)
}).$mount('#app');

在入口文件中,我们创建了一个Vue实例,并将路由配置和根组件传入。然后将Vue实例挂载到#app元素上。

用户登录

在登录组件中,我们需要调用后端API接口进行用户登录,并将返回的Token保存到本地存储中。

methods: {
  login() {
    axios.post('/api/login', {
      username: this.username,
      password: this.password
    })
    .then(response => {
      const token = response.data.token;
      localStorage.setItem('token', token);
      this.$router.push('/products');
    })
    .catch(error => {
      console.error(error);
    });
  }
}

在上述代码中,我们使用axios库发送POST请求到后端的登录接口。如果登录成功,会返回一个包含Token的响应。我们将Token保存到本地存储中,并使用$router.push方法跳转到商品列表页面。

权限校验

在商品列表组件中,我们需要进行权限校验,只有在用户登录成功并且存在Token的情况下才能访问该页面。

export default {
  created() {
    if (!localStorage.getItem('token')) {
      this.$router.push('/login');
    }
  }
};

在上述代码中,我们在组件创建时检查本地存储中是否存在Token,如果不存在则跳转到登录页面。

总结

本文介绍了如何使用Spring Security和Vue实现用户登录和权限认证的功能。通过使用JWT和Redis存储Token,我们可以实现无状态的用户认证,提高系统的可扩展性和安全性。同时,通过使用Vue的路由导航守卫,我们可以实现前端的权限校验,确保只有登录用户才能访问受限资源。希望本文能对你理解和实现用户登录和权限认证功能有所帮助。文章来源地址https://www.toymoban.com/news/detail-733538.html

到了这里,关于Spring Boot + Vue的网上商城之springsecurity+jwt+redis实现用户权限认证实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring Boot + Vue + Element UI的网上商城后台管理之订单管理系统

    以下是订单管理系统的思维导图,展示了系统的主要功能和模块之间的关系。 根节点 订单列表 查看订单列表 搜索订单 排序订单 导出订单列表 订单详情 查看订单详情 修改订单信息 修改商品信息 修改价格 修改收货地址 取消订单 处理订单 处理订单操作 确认订单 拒绝订单

    2024年02月03日
    浏览(35)
  • 【java毕业设计】基于Spring Boot+mysql的网上商城购物系统设计与实现(程序源码)-网上商城购物系统

    大家好,今天给大家介绍基于Spring Boot+mysql的网上商城购物系统设计与实现,本论文只截取部分文章重点,文章末尾附有本毕业设计完整源码及论文的获取方式。更多毕业设计源码可订阅查看上方【毕业设计】专栏获取哦。 随着科学技术的飞速发展,社会的方方面面、各行各

    2024年02月06日
    浏览(89)
  • 网上购物系统的设计与实现/在线商城/基于spring boot的电商平台/基于Java的商品销售系统

      摘   要 本毕业设计的内容是设计并且实现一个基于 Springboot 的 网上购物系统 。它是在Windows下,以MYSQL为数据库开发平台,Tomcat网络信息服务作为应用服务器。 网上购物系统 的功能已基本实现,主要包括用户管理、数码分类管理、数码产品管理、服装分类管理、服装管理

    2024年02月12日
    浏览(30)
  • 基于Springboot+vue的网上商城购物系统设计与实现

     博主介绍 :   大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下进行项目开发,具有丰富的项目经验和开发技能。我

    2024年02月10日
    浏览(37)
  • vue+django+python办公耗材网上商城采购库存管理系统

    办公耗材采购信息管理是信息行业业务流程过程中十分重要且必备的环节之一,在信息行业业务流程当中起着承上启下的作用,其重要性不言而喻。但是,目前许多信息行业在具体的业务流程处理过程中仍然使用手工操作的方式来实施,不仅费时、费力,效率低下,而且无法

    2024年02月21日
    浏览(32)
  • 毕设分享springBoot+vue 网上购物商城系统(含源码+论文)

    Hi,各位同学好呀,这里是M学姐! 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品,【基于SSM的网上购物商城】 学姐根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:5分 创新点:3分 界面美化:5分 界面美化的补充说明:使用vue的

    2024年02月11日
    浏览(38)
  • java+vue毕业设计项目 网上购物商城系统(含源码+论文)

    Hi,各位同学好呀,这里是M学姐! 今天向大家分享一个今年(2022)最新完成的毕业设计项目作品,【基于SSM的网上购物商城】 学姐根据实现的难度和等级对项目进行评分(最低0分,满分5分) 难度系数:3分 工作量:5分 创新点:3分 界面美化:5分 界面美化的补充说明:使用vue的

    2024年02月03日
    浏览(35)
  • 基于JavaWeb+SSM+Vue基于微信小程序的网上商城系统的设计和实现

    目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2 2.1微信小程序 2 2.2 MYSQL数据库 3 2.3 uni-app 3 2.4 SSM框架简介 4 3系统分析 5 3.1可行性分析 5 3.1.1技术可行性 6 3.1.2经济可行性 6 3.1.3操作可行性 6 3.2系统性能分析 6 3.2.1 系统安全性 6 3.2.2 数据完整性 7 3.3系

    2024年01月21日
    浏览(37)
  • 基于小程序的网上商城设计+springboot+vue.js附带文章和源代码设计说明文档ppt

    🌞 博主介绍 :✌CSDN特邀作者、985计算机专业毕业、某互联网大厂高级全栈开发程序员、码云/掘金/华为云/阿里云/InfoQ/StackOverflow/github等平台优质作者、专注于Java、小程序、前端、python等技术领域和毕业项目实战,以及程序定制化开发、全栈讲解、就业辅导、面试辅导、简

    2024年02月20日
    浏览(35)
  • springboot网上商城项目(一)

    🎁🎁静态资源及sql文件 链接:https://pan.baidu.com/s/1X-yjmQcPD3PqS21x0HplNA?pwd=23gr 提取码:23gr 1.项目分析 📝​📝项目功能:登录,注册,热销商品,用户管理(密码,个人信息,头像,收货地址),购物车(展示,增加,删除),订单模块 📝​📝开发顺序:注册,登录,用户管理,购物车,商品,订单模块

    2024年02月03日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包