当前位置:首页 > 后端开发 > 正文

JavaWeb鉴权怎么做

JavaWeb鉴权通常通过过滤器或拦截器实现,验证用户请求中的凭证(如Session、Token)是否合法,常用方式包括基于角色的访问控制(RBAC)、JWT令牌验证或集成安全框架如Spring Security,核心流程:拦截请求→校验权限→放行/拦截。

核心鉴权方式

Servlet Filter(基础方案)

public class AuthFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 
        throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        // 1. 检查用户是否登录(认证)
        HttpSession session = req.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            res.sendRedirect("/login");
            return;
        }
        // 2. 鉴权逻辑:检查用户角色/权限
        User user = (User) session.getAttribute("user");
        if (!user.hasPermission(req.getRequestURI())) {
            res.sendError(HttpServletResponse.SC_FORBIDDEN, "无访问权限");
            return;
        }
        chain.doFilter(request, response); // 放行请求
    }
}

配置 web.xml:

<filter>
    <filter-name>AuthFilter</filter-name>
    <filter-class>com.example.AuthFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>AuthFilter</filter-name>
    <url-pattern>/admin/*</url-pattern> <!-- 只拦截管理路径 -->
</filter-mapping>

Spring Security(企业级方案)

步骤:

  1. 添加依赖:

    JavaWeb鉴权怎么做  第1张

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
  2. 配置权限规则:

    @Configuration
    @EnableWebSecurity
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http
                .authorizeRequests()
                    .antMatchers("/public/**").permitAll()  // 公开资源
                    .antMatchers("/admin/**").hasRole("ADMIN") // 需ADMIN角色
                    .antMatchers("/user/**").hasAnyRole("USER", "ADMIN") 
                    .anyRequest().authenticated() // 其他路径需登录
                .and()
                .formLogin(); // 启用登录页
        }
    }
  3. 自定义权限校验(如方法级鉴权):

    @Service
    public class UserService {
        @PreAuthorize("hasRole('ADMIN') or #userId == authentication.principal.id")
        public void updateUser(Long userId, UserData data) {
            // 仅管理员或用户本人可操作
        }
    }

RBAC模型(权限控制基石)

基于角色的访问控制(Role-Based Access Control)是行业标准:

  • 用户(User):系统使用者
  • 角色(Role):权限集合(如ADMIN、USER)
  • 权限(Permission):具体操作(如user:delete、order:query)
graph LR
    User -- 属于 --> Role
    Role -- 拥有 --> Permission
    Permission -- 控制 --> Resource[API/页面]

JWT鉴权(前后端分离方案)

  1. 登录后生成Token:

    String jwt = Jwts.builder()
         .setSubject(username)
         .claim("roles", user.getRoles()) // 嵌入角色信息
         .setExpiration(new Date(System.currentTimeMillis() + 3600000))
         .signWith(SignatureAlgorithm.HS512, "secretKey")
         .compact();
  2. 请求校验(Filter中实现):

    String token = request.getHeader("Authorization");
    Claims claims = Jwts.parser()
         .setSigningKey("secretKey")
         .parseClaimsJws(token)
         .getBody();
    String username = claims.getSubject();
    List<String> roles = claims.get("roles", List.class);
    // 将角色信息存入SecurityContextHolder

安全最佳实践

  1. 最小权限原则:用户仅拥有必要权限
  2. 防范越权
    • 垂直越权:普通用户访问管理员接口 → 用角色校验拦截
    • 水平越权:用户A修改用户B的数据 → 校验数据归属(如@PreAuthorize("#userId == principal.id")
  3. 敏感操作日志:记录关键操作(删除、权限变更)
  4. 定期更换密钥:JWT签名密钥至少每季度更换
  5. 避免路径硬编码:使用权限标识符而非URL匹配(如hasPermission('user:delete')

常见问题解决方案

  • 权限动态变更:实时生效需结合Redis(将权限缓存并设置过期时间)
  • 分布式鉴权:JWT适合无状态系统,Session方案需用Spring Session + Redis共享
  • CSRF防护:Spring Security默认启用,表单操作需携带_csrf令牌

JavaWeb鉴权需结合场景选择方案:

  • 单体应用:Spring Security + Session
  • 前后端分离:Spring Security + JWT
  • 微服务架构:OAuth2.0 + 网关统一鉴权

引用说明: 参考Spring Security官方文档(spring.io/projects/spring-security)及OWASP访问控制指南(owasp.org/www-project-authorization),技术实现基于JDK 11+与Spring Boot 2.7,遵循MIT开源协议。

0