温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java API接口如何鉴权

发布时间:2026-07-17 02:29:27 来源:亿速云 阅读:110 作者:小樊 栏目:编程语言

在 Java 中,API 接口鉴权(Authentication & Authorization)常见做法取决于系统架构(单体 / 微服务)、安全级别和是否使用 Spring。下面按常见方案 → 实现思路 → 示例代码来说明。


一、常见 API 鉴权方式

1️⃣ 基于 Session + Cookie(传统 Web)

适用场景:前后端不分离、单体应用

流程

  1. 用户登录
  2. 服务端创建 Session
  3. 返回 SessionId(Cookie)
  4. 后续请求自动携带 Cookie

特点

  • 服务端保存状态
  • 不适合分布式 / 微服务

2️⃣ Token 鉴权(主流 ✅)

✅ JWT(JSON Web Token)

适用场景:前后端分离、微服务、移动端

流程

  1. 用户登录
  2. 服务端生成 JWT
  3. 客户端保存 Token(Header)
  4. 每次请求携带 Authorization

示例 Header

Authorization: Bearer eyJhbGciOiJIUzI1NiJ9...

3️⃣ OAuth2 / OpenID Connect

适用场景

  • 第三方登录
  • 企业级系统
  • SSO

角色

  • Resource Owner(用户)
  • Authorization Server
  • Resource Server(你的 API)

4️⃣ API Key / Signature(内部接口)

适用场景

  • 内部服务调用
  • 开放平台

方式

  • Header 传 API Key
  • 请求签名(防篡改)

二、Spring Boot 中最常用:JWT 鉴权示例

1️⃣ 登录接口返回 Token

@PostMapping("/login")
public String login(@RequestBody LoginRequest req) {
    if ("admin".equals(req.getUsername()) && "123".equals(req.getPassword())) {
        return JwtUtil.generateToken(req.getUsername());
    }
    throw new RuntimeException("用户名或密码错误");
}

2️⃣ JWT 工具类

public class JwtUtil {

    private static final String SECRET = "secret-key";
    private static final long EXPIRATION = 3600_000;

    public static String generateToken(String username) {
        return Jwts.builder()
                .setSubject(username)
                .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION))
                .signWith(SignatureAlgorithm.HS256, SECRET)
                .compact();
    }

    public static String parseToken(String token) {
        return Jwts.parser()
                .setSigningKey(SECRET)
                .parseClaimsJws(token)
                .getBody()
                .getSubject();
    }
}

3️⃣ 拦截器 / 过滤器鉴权(重点 ✅)

✅ 使用 Filter

@Component
public class JwtFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request,
                                    HttpServletResponse response,
                                    FilterChain chain)
            throws IOException, ServletException {

        String auth = request.getHeader("Authorization");
        if (auth == null || !auth.startsWith("Bearer ")) {
            response.setStatus(401);
            return;
        }

        String token = auth.substring(7);
        try {
            String user = JwtUtil.parseToken(token);
            // 可存入上下文
            UserContext.set(user);
        } catch (Exception e) {
            response.setStatus(401);
            return;
        }

        chain.doFilter(request, response);
    }
}

4️⃣ 注册 Filter

@Configuration
public class FilterConfig {

    @Bean
    public FilterRegistrationBean<JwtFilter> jwtFilter() {
        FilterRegistrationBean<JwtFilter> bean = new FilterRegistrationBean<>();
        bean.setFilter(new JwtFilter());
        bean.addUrlPatterns("/api/*");
        return bean;
    }
}

三、Spring Security(企业级推荐 ✅)

特点

  • 自动处理认证 / 授权
  • 支持 JWT、OAuth2
  • 安全、成熟

常见结构

http
  .csrf().disable()
  .authorizeHttpRequests()
  .requestMatchers("/login").permitAll()
  .anyRequest().authenticated()
  .and()
  .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);

四、鉴权 vs 授权

类型 说明
鉴权(Authentication) 你是谁?
授权(Authorization) 你能干什么?

示例

@PreAuthorize("hasRole('ADMIN')")
public void deleteUser() {}

五、生产环境建议 ✅

✅ 使用 JWT + Spring Security
✅ Token 过期 + 刷新 Token
✅ HTTPS
✅ 黑名单 / 白名单
✅ 签名密钥放配置中心


如果你愿意,可以告诉我:

  • 是否使用 Spring Boot
  • 单体 / 微服务
  • 鉴权粒度(登录 / 接口 / 方法级别)

我可以给你更贴合你项目的完整方案

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI