0%

springSecurity流程

认证流程

  • 登录请求进入UsernamePasswordAuthenticationFilter,父类是AbstractAuthenticationProcessingFilter,执行AbstractAuthenticationProcessingFilter的doFilter方法

    1
    authResult = attemptAuthentication(request, response);
  • 确认一下该请求是否需要认证,如果需要认证且此时还没有进行认证,则尝试进行认证,调用UsernamePasswordAuthenticationFilter的attemptAuthentication方法,将从请求中获取的用户名和密码封装成UsernamePasswordAuthenticationToken对象(认证状态为未认证)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(
    username, password);

    public UsernamePasswordAuthenticationToken(Object principal, Object credentials) {
    super(null);
    this.principal = principal;
    this.credentials = credentials;
    // 设置为未认证
    setAuthenticated(false);
    }
  • 通过AuthenticationManager(实现类是ProviderManager)委托AuthenticationProvider(实现类是DaoAuthenticationProvider)关联UserDetailsService进行认证过程

阅读全文 »

过滤web请求

在spring中存在一个DelegatingFilterProxy,是一种特殊的Filter,主要任务就是将工作委托给Filter实现类

使用@EnableWebSecurity注解时引入FilterChainProxy

1
2
3
4
5
6
7
8
9
10
11
12
@Bean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)
public Filter springSecurityFilterChain() throws Exception {
boolean hasConfigurers = webSecurityConfigurers != null
&& !webSecurityConfigurers.isEmpty();
if (!hasConfigurers) {
WebSecurityConfigurerAdapter adapter = objectObjectPostProcessor
.postProcess(new WebSecurityConfigurerAdapter() {
});
webSecurity.apply(adapter);
}
return webSecurity.build();
}

可以使用WebApplicationInitializer的方式来配置DelegatingFilterProxy,其会自动为每个url注册springSecurityFilterChain过滤器(也就是DelegatingFilterProxy),添加一个ContextLoaderListener来载入WebSecurityConfig

1
2
3
4
// AbstractSecurityWebApplicationInitializer类实现了WebApplicationInitializer接口,spring会发现,并在web容器中注册DelegatingFilterProxy
public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer {

}

DelegatingFilterProxy会拦截发往应用中的请求,并将请求委托给springSecurityFilterChain,springSecurityFilterChain本身是另一种特殊的Filter,可以连接任意一个或多个其他的Filter

1
2
3
4
5
6
7
8
9
10
11
private void insertSpringSecurityFilterChain(ServletContext servletContext) {
// DEFAULT_FILTER_NAME就是springSecurityFilterChain
String filterName = DEFAULT_FILTER_NAME;
DelegatingFilterProxy springSecurityFilterChain = new DelegatingFilterProxy(
filterName);
String contextAttribute = getWebApplicationContextAttribute();
if (contextAttribute != null) {
springSecurityFilterChain.setContextAttribute(contextAttribute);
}
registerFilter(servletContext, true, filterName, springSecurityFilterChain);
}
阅读全文 »

springSecurity简介

Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案,是一种基于Spring AOP和Servlet规范中的Filter实现的安全框架,其本质是一个过滤器链

名词解释

**主体(principal)**使用系统的用户或设备或从其他系统远程登录的用户等等,谁在使用该系统

**认证(authentication)**权限管理系统确认一个主体的身份,允许主体进入系统,“主体”证明自己是谁。

**授权(authorization)**将操作系统的“权力”授予“主体”,这样主体就具备了操作系统中特定功能的能力,授权就是给用户分配权限

1
2
3
4
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
阅读全文 »

监控工具

jvm自带的命令

jps命令

jps可以查看正在运行的java进程,并显示虚拟机执行主类的名称

1
2
3
4
5
6
jps [-q] [-mlvV] [<hostid>]

-q 仅显示java进程id,不显示主类的名称
-l 输出应用程序主类的全类名或jar包的完整路径
-m 输出虚拟机进程启动时传递给主类main()的参数
-v 列出虚拟机进程启动时的JVM参数

如果java程序启动 -XX:-UsePerfData,jps将无法探知到该java进程

阅读全文 »

keepalived

Keepalived是一款用于保障服务高可用性的软件,它能自动侦测服务器状态、移除故障服务器、切换到正常运行的服务器、添加恢复后的服务器到集群中。

实现的基本思路

Keepalived是基于VRRP协议的实现,主要用在IP层、TCP层和应用层。

  • IP层:Keepalived会定期向服务器群中的服务器发送一个ICMP数据包(Ping),如果发现IP地址没有激活,Keepalived便报告这台服务器失效,并将它从服务器群中剔除。
  • TCP层:类似IP层,只不过这里是检测TCP服务的端口
  • 应用层:Keepalived将根据用户的设定来检查服务程序的运行是否正常
阅读全文 »