在 Java 里做 API 接口鉴权(Authentication / Authorization),常见做法有几种,下面按使用频率和场景给你梳理一下,并附上示例。
适合:前后端分离、移动端、微服务
Header 中携带// 登录接口
@PostMapping("/login")
public String login(@RequestBody User user) {
if ("admin".equals(user.getUsername()) && "123".equals(user.getPassword)) {
return JwtUtil.createToken(user.getUsername());
}
throw new RuntimeException("账号或密码错误");
}
// 拦截器校验
public class JwtInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request,
HttpServletResponse response,
Object handler) {
String token = request.getHeader("Authorization");
if (token == null || !JwtUtil.verify(token)) {
response.setStatus(401);
return false;
}
return true;
}
}
适合:单体 Web 应用
@PostMapping("/login")
public void login(HttpSession session) {
session.setAttribute("user", "admin");
}
@GetMapping("/api")
public String api(HttpSession session) {
if (session.getAttribute("user") == null) {
throw new RuntimeException("未登录");
}
return "ok";
}
适合:第三方授权、微服务、统一登录
@EnableAuthorizationServer
@Configuration
public class AuthServer extends AuthorizationServerConfigurerAdapter {
// 配置 client、token 存储等
}
适合:开放 API、内部服务调用
@GetMapping("/api")
public String api(@RequestHeader("api-key") String apiKey) {
if (!"abc123".equals(apiKey)) {
throw new RuntimeException("非法请求");
}
return "success";
}
适合:高安全场景(支付、开放平台)
String sign = MD5(params + secret);
if (!sign.equals(requestSign)) {
throw new RuntimeException("签名错误");
}
| 场景 | 推荐方案 |
|---|---|
| 前后端分离 | JWT |
| 传统 Web | Session |
| 微服务 | OAuth2 |
| 开放 API | API Key + 签名 |
| 高安全 | OAuth2 + 签名 |
✅ 密码必须加密(BCrypt)
✅ Token 设置过期时间
✅ HTTPS 必开
✅ 接口统一拦截鉴权
✅ 错误信息不要暴露细节
如果你能告诉我:
我可以直接给你一套可落地的完整鉴权方案。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。