当前位置:首页 > 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实现盖章

vue实现盖章

Vue 实现盖章功能 在Vue中实现盖章功能通常涉及前端UI交互,通过Canvas或SVG绘制印章,并允许用户拖拽或点击放置印章。以下是具体实现方法: 使用Canvas绘制印章 通过HTML5的Ca…

vue实现异步

vue实现异步

Vue 实现异步操作的常见方法 Vue 提供了多种方式来处理异步操作,包括数据获取、事件处理等场景。 使用 async/await 在 Vue 方法中可以直接使用 async/await 语法处理异…

vue实现分栏

vue实现分栏

Vue实现分栏的常见方法 使用CSS Flexbox布局 通过Flexbox可以快速实现分栏效果,适合大多数响应式布局场景 <template> <div class="con…

vue 实现上传

vue 实现上传

Vue 实现文件上传 使用 Vue 实现文件上传可以通过原生 HTML 的 <input type="file"> 或第三方库(如 axios、vue-upload-component)完…

vue 实现vshow

vue 实现vshow

Vue 实现 v-show 在 Vue 中,v-show 是一个常用的指令,用于根据条件控制元素的显示或隐藏。与 v-if 不同,v-show 不会移除 DOM 元素,而是通过 CSS 的 displ…

vue实现双击

vue实现双击

Vue 实现双击事件的方法 在Vue中实现双击事件可以通过以下几种方式完成,具体选择取决于项目需求和开发习惯。 使用 @dblclick 指令 Vue提供了内置的@dblclick指令,可以直接在模…