Skip to content

2024年7月26日工作任务安排

1. 学习Spring AOP和Spring Security的基本概念

1.1 Spring AOP概念

  • AOP(面向切面编程):一种编程范式,用于分离横切关注点,如日志记录、事务管理等。
  • 主要概念
    • Aspect:切面,模块化关注点。
    • Advice:通知,定义在特定连接点执行的代码。
    • Pointcut:切入点,定义Advice应用的连接点。
    • JoinPoint:连接点,程序执行的点。
    • Weaving:织入,将切面与目标对象关联。

1.2 Spring Security概念

  • Spring Security:提供强大的认证和授权框架,保护Java应用程序。
  • 主要功能
    • 认证:验证用户身份。
    • 授权:控制用户对资源的访问权限。
    • CSRF保护:防止跨站请求伪造攻击。
    • 安全过滤器链:多层次的请求拦截机制。

2. 实现AOP切面编程,编写日志和性能监控切面

2.1 日志切面示例

java
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.ProceedingJoinPoint;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Aspect
public class LoggingAspect {

    private static final Logger logger = LoggerFactory.getLogger(LoggingAspect.class);

    @Pointcut("execution(* com.example.service.*.*(..))")
    public void serviceMethods() {
        // 定义切入点
    }

    @Before("serviceMethods()")
    public void logBeforeMethod(JoinPoint joinPoint) {
        logger.info("Entering method: {} with arguments: {}", joinPoint.getSignature(), joinPoint.getArgs());
    }

    @AfterReturning(pointcut = "serviceMethods()", returning = "result")
    public void logAfterMethod(JoinPoint joinPoint, Object result) {
        logger.info("Exiting method: {} with result: {}", joinPoint.getSignature(), result);
    }

    @Around("serviceMethods()")
    public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable {
        long start = System.currentTimeMillis();
        Object proceed = joinPoint.proceed();
        long executionTime = System.currentTimeMillis() - start;
        logger.info("{} executed in {} ms", joinPoint.getSignature(), executionTime);
        return proceed;
    }
}

3. 使用Spring Security实现基本的用户认证和授权

3.1 Spring Security配置示例

java
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@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角色可以访问
                .anyRequest().authenticated()  // 其他请求需要认证
            .and()
            .formLogin()
                .loginPage("/login")  // 自定义登录页
                .permitAll()
            .and()
            .logout()
                .permitAll();
    }
}

4. 说明安全在项目中的应用和最佳实践

  • HTTPS:确保所有通信加密。
  • 输入验证和输出编码:防止SQL注入和XSS攻击。
  • 定期更新依赖:使用最新的安全补丁和版本。
  • 细粒度的权限控制:确保只有授权用户能访问特定资源。