当前位置:首页 > VUE

vue shiro实现登录

2026-02-17 15:03:03VUE

Vue 与 Shiro 实现登录功能

Vue 作为前端框架与 Shiro 作为后端安全框架结合,可以实现安全的登录认证。以下是具体实现步骤:

前端 Vue 部分

  1. 创建登录页面 使用 Vue 创建登录表单,包含用户名和密码输入框以及登录按钮。通过 Axios 发送登录请求到后端。
<template>
  <div>
    <input v-model="username" placeholder="用户名">
    <input v-model="password" type="password" placeholder="密码">
    <button @click="login">登录</button>
  </div>
</template>

<script>
import axios from 'axios';

export default {
  data() {
    return {
      username: '',
      password: ''
    }
  },
  methods: {
    login() {
      axios.post('/api/login', {
        username: this.username,
        password: this.password
      }).then(response => {
        // 处理登录成功逻辑
      }).catch(error => {
        // 处理错误
      });
    }
  }
}
</script>
  1. 处理登录状态 登录成功后,保存 token 到 localStorage 或 Vuex 中,用于后续请求的认证。
localStorage.setItem('token', response.data.token);
  1. 请求拦截器 通过 Axios 拦截器,在每次请求时携带 token。
axios.interceptors.request.use(config => {
  const token = localStorage.getItem('token');
  if (token) {
    config.headers.Authorization = `Bearer ${token}`;
  }
  return config;
});

后端 Shiro 部分

  1. 配置 Shiro 在 Spring Boot 中配置 Shiro,定义 Realm 和过滤器。
@Configuration
public class ShiroConfig {
    @Bean
    public ShiroFilterFactoryBean shiroFilterFactoryBean(DefaultWebSecurityManager securityManager) {
        ShiroFilterFactoryBean factoryBean = new ShiroFilterFactoryBean();
        factoryBean.setSecurityManager(securityManager);

        Map<String, String> filterMap = new LinkedHashMap<>();
        filterMap.put("/api/login", "anon");
        filterMap.put("/", "authc");
        factoryBean.setFilterChainDefinitionMap(filterMap);

        return factoryBean;
    }

    @Bean
    public DefaultWebSecurityManager securityManager(MyRealm realm) {
        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
        securityManager.setRealm(realm);
        return securityManager;
    }
}
  1. 自定义 Realm 实现自定义 Realm 进行认证和授权逻辑。
public class MyRealm extends AuthorizingRealm {
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {
        UsernamePasswordToken upToken = (UsernamePasswordToken) token;
        String username = upToken.getUsername();
        String password = new String(upToken.getPassword());

        // 验证用户名和密码
        if (!"admin".equals(username) || !"123456".equals(password)) {
            throw new AuthenticationException("用户名或密码错误");
        }

        return new SimpleAuthenticationInfo(username, password, getName());
    }

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
        // 授权逻辑
        return null;
    }
}
  1. 登录接口 创建登录接口,Shiro 进行认证后返回 token。
@RestController
public class LoginController {
    @PostMapping("/api/login")
    public ResponseEntity<?> login(@RequestBody LoginRequest request) {
        Subject subject = SecurityUtils.getSubject();
        UsernamePasswordToken token = new UsernamePasswordToken(request.getUsername(), request.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("登录失败");
        }
    }
}

安全注意事项

  1. 使用 HTTPS 加密传输数据,避免密码明文传输。
  2. 后端应对密码进行哈希处理,避免明文存储。
  3. 实现合理的会话超时机制。
  4. 前端应对敏感信息进行适当保护,避免 XSS 攻击。

跨域问题处理

如果前后端分离部署,需要处理跨域问题。

@Configuration
public class CorsConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                .allowedHeaders("*")
                .exposedHeaders("Authorization")
                .allowCredentials(true)
                .maxAge(3600);
    }
}

通过以上步骤,可以实现 Vue 前端与 Shiro 后端的登录认证功能。根据实际需求,可以进一步扩展权限控制、记住我功能等。

vue shiro实现登录

标签: vueshiro
分享给朋友:

相关文章

vue实现防抖节流

vue实现防抖节流

Vue 中实现防抖(Debounce) 防抖的核心是延迟执行函数,在连续触发时取消前一次的调用,只执行最后一次。适用于输入框搜索、窗口大小调整等场景。 方法1:使用 Lodash 的 _.debo…

vue自己实现下拉导航

vue自己实现下拉导航

实现下拉导航的基本思路 在Vue中实现下拉导航,可以通过结合Vue的响应式数据和事件绑定特性来完成。主要思路是利用v-show或v-if控制下拉菜单的显示与隐藏,并通过鼠标事件或点击事件触发状态变化。…

vue实现选中单元格

vue实现选中单元格

Vue 实现选中单元格的方法 基础实现思路 在 Vue 中实现选中单元格功能,通常可以通过动态绑定 class 或 style 来实现。以下是一个基于表格的简单实现示例: <template…

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

实现vue模版

实现vue模版

Vue 模板的基本结构 Vue 模板基于 HTML 语法,通过 Vue 的指令和插值实现动态渲染。以下是一个基础模板示例: <template> <div id="app…

vue实现新闻

vue实现新闻

Vue 实现新闻功能 使用 Vue 实现新闻功能通常涉及新闻列表展示、新闻详情页、分类筛选等模块。以下是实现的基本思路和代码示例。 新闻列表展示 通过 Vue 组件展示新闻列表,通常使用 v-fo…