当前位置:首页 > VUE

vue shiro实现登录

2026-01-16 22:29:36VUE

Vue 与 Shiro 实现登录的整合方案

Vue 作为前端框架,Shiro 作为 Java 后端的安全框架,实现登录需要前后端协作。以下是具体实现步骤:

前端 Vue 实现登录逻辑

  1. 创建登录表单组件
    使用 Vue 的模板语法构建登录表单,包含用户名和密码输入框,以及提交按钮。

    <template>
      <form @submit.prevent="handleLogin">
        <input v-model="username" placeholder="用户名" />
        <input v-model="password" type="password" placeholder="密码" />
        <button type="submit">登录</button>
      </form>
    </template>
  2. 处理登录请求
    通过 Axios 或其他 HTTP 客户端向后端发送登录请求,携带用户名和密码。

    methods: {
      handleLogin() {
        axios.post('/api/login', {
          username: this.username,
          password: this.password
        }).then(response => {
          // 登录成功处理
          localStorage.setItem('token', response.data.token);
          this.$router.push('/dashboard');
        }).catch(error => {
          console.error('登录失败', error);
        });
      }
    }
  3. 存储 Token 并跳转
    登录成功后,将返回的 Token 存储到本地(如 localStorage),并跳转到主页或受保护的路由。

    vue shiro实现登录

后端 Shiro 实现认证逻辑

  1. 配置 Shiro 过滤器
    在 Spring Boot 中配置 Shiro 的过滤器链,确保 /api/login 路径允许匿名访问,其他路径需要认证。

    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        factoryBean.setSecurityManager(securityManager);
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
        filterChainDefinitionMap.put("/api/login", "anon");
        filterChainDefinitionMap.put("/", "authc");
        factoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return factoryBean;
    }
  2. 实现登录接口
    创建登录接口,接收用户名和密码,调用 Shiro 的 Subject.login 进行认证。

    vue shiro实现登录

    @PostMapping("/api/login")
    public ResponseEntity<?> login(@RequestBody LoginRequest loginRequest) {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(
            loginRequest.getUsername(),
            loginRequest.getPassword()
        );
        try {
            subject.login(token);
            String sessionId = (String) subject.getSession().getId();
            return ResponseEntity.ok().body(new LoginResponse(sessionId));
        } catch (AuthenticationException e) {
            return ResponseEntity.status(401).body("认证失败");
        }
    }
  3. 自定义 Realm
    实现 AuthorizingRealm,重写 doGetAuthenticationInfo 方法,从数据库或其他数据源验证用户信息。

    public class CustomRealm extends AuthorizingRealm {
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
            UsernamePasswordToken upToken = (UsernamePasswordToken) token;
            String username = upToken.getUsername();
            User user = userService.findByUsername(username);
            if (user == null) {
                throw new UnknownAccountException("用户不存在");
            }
            return new SimpleAuthenticationInfo(user.getUsername(), user.getPassword(), getName());
        }
    }

跨域与 Token 验证

  1. 解决跨域问题
    在 Spring Boot 中配置跨域支持,确保 Vue 前端可以访问后端接口。

    @Configuration
    public class CorsConfig implements WebMvcConfigurer {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*");
        }
    }
  2. Token 验证机制
    使用 Shiro 的 DefaultWebSessionManager 或 JWT 实现无状态认证。例如,将 Token 放在请求头中,后端通过过滤器验证。

    public class TokenFilter extends AccessControlFilter {
        @Override
        protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
            String token = getRequestToken((HttpServletRequest) request);
            if (token == null) {
                return false;
            }
            return validateToken(token);
        }
    }

安全增强建议

  • 使用 HTTPS 加密通信,防止密码泄露。
  • 对密码进行加盐哈希存储,避免明文存储。
  • 限制登录尝试次数,防止暴力破解。
  • 定期刷新 Token,增强安全性。

通过以上步骤,可以实现 Vue 前端与 Shiro 后端的登录功能,确保用户认证的安全性和可靠性。

标签: vueshiro
分享给朋友:

相关文章

vue实现anchor

vue实现anchor

Vue 实现 Anchor(锚点)功能 在 Vue 中实现锚点功能可以通过多种方式完成,以下是几种常见的方法: 使用 HTML 原生锚点 HTML 原生锚点是最简单的方式,通过 <a>…

vue实现密码

vue实现密码

Vue 密码输入组件实现 基础密码输入框实现 使用 Vue 的 v-model 指令绑定数据,并通过 type="password" 设置输入类型为密码: <template> &…

vue点击实现排序

vue点击实现排序

实现点击排序的方法 在Vue中实现点击排序功能,可以通过以下几种方式完成: 使用计算属性结合排序方法 定义一个响应式数据存储排序状态,通过计算属性动态返回排序后的数组。点击事件切换排序状态。…

vue实现裁剪头像

vue实现裁剪头像

Vue 实现头像裁剪功能 实现头像裁剪功能通常需要结合第三方库如 cropperjs 或 vue-cropper。以下是两种常见实现方式: 使用 vue-cropper 库 安装依赖: np…

vue表单实现搜索

vue表单实现搜索

实现Vue表单搜索功能 在Vue中实现表单搜索功能通常涉及表单绑定、事件处理和搜索逻辑。以下是具体实现方法: 数据绑定与表单结构 使用v-model实现表单与Vue数据的双向绑定: <t…

vue登录逻辑的实现

vue登录逻辑的实现

Vue 登录逻辑实现 前端实现 创建登录组件 在 Vue 项目中创建一个登录组件,通常命名为 Login.vue。该组件包含表单元素,如用户名和密码输入框,以及提交按钮。 <template…